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