C++ map / unordered_map 如何同时存储多种类型

c++ 17 之前的版本可以自定义struct , 存储多种类型。

c++ 17开始 提供一个新的类型 std::variant

#include <iostream>
#include <unordered_map>
#include <string>
#include <variant>

int main() {
    // 值 声明为 std::variant<int,std::string> 
    std::unordered_map<std::string, std::variant<int,std::string>> myMap;
    myMap["apple"] = 1;
    myMap["banana"] = 2;
    myMap["cherry"] = 3;
    myMap["date"] = std::string("four");
  // 遍历 map
    auto begin = myMap.cbegin();
    while (begin != myMap.cend()) {
        // std::variant 访问值有两个方法,std::cout 不能直接输出 variant 变量
         //  std::get<int>()  std::get_if<int>() 
         // 两者的区别在于 std::get 如果获取的类型不存在 会抛出异常  , std::get_if 返回 nullptr
        const auto *val = std::get_if<int>(&begin->second);
        if(val == nullptr) {
            ++begin;
            continue;
        }
        std::cout << begin->first << ": " <<  *val << std::endl;
        ++begin;
    }

    for (auto b = myMap.begin(); b != myMap.end(); b++)
    {
        //不判断类型 ,抛出异常 std::bad_variant_access
        std::cout << b->first << ": " << std::get<std::string>(b->second) << std::endl;
    }
    
    
    return 0;
}
Output:

cherry: 3
banana: 2
apple: 1
date: four
cherry: terminate called after throwing an instance of 'std::bad_variant_access'
  what():  std::get: wrong index for variant

版权声明:本文为NII.CN的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://nii.cn/4313.html 发布者:nii

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
nii的头像nii
上一篇 2024-12-17 11:52
下一篇 2021-08-07 16:48

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

邮件:83390286[AT]QQ.COM

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信