使用c++使用一个类型键但不同类型值的复杂映射.(不是Multmap)

Complex Map with One Type Key but different Type Values using C++. (Not Multmap)

本文关键字:同类型 复杂 Multmap 不是 映射 类型 c++ 使用 一个      更新时间:2023-10-16

我想做一个这样的地图,

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会产生段故障。您可以通过编写一个带有两个变量的类来解决这个问题,这两个变量知道它是否包含stringint。如果你把它写成一个模板版本,它最终可能是boost::variant的等价物。