使用c++使用一个类型键但不同类型值的复杂映射.(不是Multmap)
Complex Map with One Type Key but different Type Values using C++. (Not Multmap)
我想做一个这样的地图,
1)共计50个String Keys。2)前40个值是字符串。3)其他10个值为整数
//No idea how to initialize this map but after initialization
map2D["Key-1"]="Value-1";
map2D["Key-2"]="Value-2";
map2D["Key-3"]="Value-3";
........................
........................
........................
map2D["Key-39"]="Value-39";
map2D["Key-41"]= 123;
map2D["Key-42"]=234;
.......................
.......................
.......................
map2d["Key-50"]=24132;
知道如何达到这个目标吗?由于
您可以使用boost库中的类变体。可以把它看作非pod类型的联合。
http://www.boost.org/doc/libs/1_55_0/doc/html/variant.html下面是一个来自网页的例子:
std::vector< boost::variant<int, std::string> > vec;
vec.push_back( 21 );
vec.push_back( "hello " );
那么,容器的值类型可以是boost::variant<int, std::string>
从技术角度来看,tgmath的两个解决方案都是正确的,但我认为您应该重新考虑您要完成的任务。在地图中设置两种不同类型的目的是什么?您将如何实际使用这些值?
c++中的类型允许您使用编译器来选择应该对该类型表示的数据执行哪些操作。它们还有一个更重要的作用,那就是向开发人员(可能是另一个开发人员,也可能是你以后的工作)传达你希望对该类型所表示的数据进行哪种操作的含义。
那么您将如何处理映射中的值呢?如果您将在计算中使用它们,则需要一种方法来确定您的值是字符串还是整数。如果要获得一个变体或联合,则必须在使用之前测试实际表示的是哪个值。
如果您只是输出值,或其他字符串友好的操作,从设计的角度来看,最好存储字符串。如果您执行的操作必须根据您使用的是字符串还是整数而表现不同,那么您可能需要考虑使用继承——创建一个类MapValue(使用更有意义的名称),它继承了IntValue和StringValue。编译器将使用rtti来使用正确的行为。
联合具有内存效率和节省(通常微不足道的)rtti开销的好处。
这是一个没有boost的解决方案。使用联合体和c++ 11。它允许非pod成员。但是要小心字符串的创建和删除,以防止内存泄漏。
union Compound {
std::string str;
int i;
~Compound() {}
};
使用它的运行示例:http://ideone.com/SUyyv1
还有一件事:两个变量都存储在同一个内存块中。如果只给定int
,则读取string
会产生段故障。您可以通过编写一个带有两个变量的类来解决这个问题,这两个变量知道它是否包含string
或int
。如果你把它写成一个模板版本,它最终可能是boost::variant的等价物。
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 将平面阵列重塑为复杂的特征类型
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 如何在<double>矢量中创建复杂类型的模板<T>?
- 在没有标识符的情况下如何读取复杂的C++类型声明?
- 将可变参数类型列表的扩展打包为复杂类型的初始值设定项列表 - 合法吗?
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- printf 数据类型说明符复杂问题
- 表达式模板玩具示例:用户定义的强制转换不适用于复杂类型
- C++ 类型 'complex<double>' 中类中的复杂初始化不提供调用运算符
- boost odeint 中的受控误差步进器是否支持复杂的数据类型?
- 包装一个函数,在 Cython 中返回复杂类型的向量
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 如何修复复杂类型的倍数和铸造
- C++复杂类型的单一方法的模板专用化
- MISRA 警告<复杂表达式隐式转换为不同的基本类型>
- 调用C++具有复杂参数和复杂返回类型的函数 C 代码
- 复杂数据类型向量的迭代器
- 具有复杂值类型的迭代器:与value_type和引用混淆