C++ 使用C+;具有一个类型键但不同类型值的复杂映射+;。(不是Multmap)

C++ 使用C+;具有一个类型键但不同类型值的复杂映射+;。(不是Multmap),c++,map,C++,Map,我想画一张这样的地图 1) 总共50个字符串键。 2) 前40个值是字符串。 3) 其他10个值是整数 像 任何关于如何实现这一目标的想法。谢谢您可以使用boost库中的类变量。将其视为非POD类型的联盟 以下是网页中的一个示例: std::vector< boost::variant<int, std::string> > vec; vec.push_back( 21 ); vec.push_back( "hello " ); std::vectorvec; 向量推

我想画一张这样的地图

1) 总共50个字符串键。 2) 前40个值是字符串。 3) 其他10个值是整数


任何关于如何实现这一目标的想法。谢谢

您可以使用boost库中的类变量。将其视为非POD类型的联盟

以下是网页中的一个示例:

std::vector< boost::variant<int, std::string> > vec;
vec.push_back( 21 );
vec.push_back( "hello " );
std::vectorvec;
向量推回(21);
向量推回(“你好”);

因此,容器的值类型可以是
boost::variant

这里是一个没有boost的解决方案。使用union和C++11。它允许非POD成员。 但是在创建和删除字符串时要小心,以防止内存泄漏

union Compound {
    std::string str;
    int i;
    ~Compound() {}
};
使用它的一个运行示例:

另一件事:两个变量都存储在同一个内存块中。如果只给出
int
,则读取
字符串会产生SEGFULT。
您可以通过编写一个包含两个变量的类来解决这个问题,这些变量知道它是包含
字符串还是
int

如果您将其编写为模板版本,那么它可能最终会成为boost::variant的等价物。

从技术角度来看,tgmath的两种解决方案都是正确的,但我认为您应该重新思考您试图实现的目标。在地图上有两种不同的类型的目的是什么?您将如何实际使用这些值

类型中的C++允许使用编译器选择对该类型表示的数据执行哪些操作。它们还有一个非常重要的用途,那就是与开发人员(可能是另一个开发人员,也可能是您以后的开发人员)进行通信,了解您希望对类型所表示的数据执行哪些类型的操作

那么,您将如何处理地图中的值呢?如果要在计算中使用它们,则需要一种方法来确定值是字符串还是整数。如果您得到一个变量或联合,那么在使用之前,您必须测试实际表示的值

如果只是输出值或其他字符串友好的操作,那么从设计的角度来看,最好存储字符串。如果您执行的操作必须根据您是否使用字符串或整数而有所不同,那么您可能需要考虑使用继承——创建类MaValk(使用更有意义的名称),它继承了ItValuy和String值。编译器将使用rtti来使用正确的行为


联合会将有内存效率和节省内存的好处(通常不重要)rtti开销。

创建一个包含字符串或int的对象,并将其作为值插入。您可以使用
boost::any
作为值类型。@kerrekSB…我想使用一个映射,而不使用boost库来完成此操作。不使用boost有什么想法吗?是的。说得好。如果你考虑这一点可能会有所帮助。另外,使用两张地图(正如@Kerrek_SB所建议的)也是一个很好的观点。
union Compound {
    std::string str;
    int i;
    ~Compound() {}
};