我想做一张这样的地图,
1)共有50个字符串键。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;任何想法如何实现这个目标。谢谢
发布于 2014-06-25 17:03:45
您可以使用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>。
发布于 2014-06-25 19:19:20
从技术角度来看,tgmath的两个解决方案都是正确的,但我认为您应该重新考虑您正在尝试实现的目标。在地图中有两个不同类型的目的是什么?您将如何实际使用这些值?
C++中的类型允许您使用编译器来选择应该对该类型表示的数据执行哪些操作。它们服务于另一个非常重要的目的,那就是向开发人员(可能是另一个开发人员,也许是您以后的开发人员)传达一些关于您期望对该类型表示的数据执行哪种类型的操作的含义。
那么,您将如何处理地图中的值?如果要在计算中使用它们,则需要一种方法来确定值是字符串还是整数。如果要获取变量或联合,则必须在使用之前测试实际表示的值。
如果只是输出值或其他字符串友好的操作,从设计的角度来看,最好是存储一个字符串。如果您执行的操作必须根据使用的是字符串还是整数而有所不同,那么您可能需要考虑使用继承--创建一个类MapValue (使用一个更有意义的名称),该类继承了IntValue和StringValue。编译器将使用rtti来使用正确的行为。
联合将具有内存效率和节省(通常微不足道的) rtti开销的好处。
发布于 2014-06-25 18:51:23
这里有一个没有boost的解决方案。使用联合和C++11。它允许非POD成员。但在创建和删除字符串时要小心,以防止内存泄漏。
union Compound {
std::string str;
int i;
~Compound() {}
};一个使用它的运行示例:http://ideone.com/SUyyv1
另一件事:这两个变量都存储在同一个内存块中。如果只给出了一个int,它可能会产生一个段错误来读取string。你可以通过编写一个包含两个变量的类来修复这个问题,这个变量知道它包含的是string还是int。如果你把它写成一个模板版本,它可能会变成一个boost::variant等效项。
https://stackoverflow.com/questions/24404276
复制相似问题