首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有一个类型键但使用C++的不同类型值的复杂映射。(不是多面图)

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

Stack Overflow用户
提问于 2014-06-25 16:56:41
回答 3查看 55关注 0票数 0

我想做一张这样的地图,

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

喜欢

代码语言:javascript
复制
//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;

任何想法如何实现这个目标。谢谢

EN

回答 3

Stack Overflow用户

发布于 2014-06-25 17:03:45

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

http://www.boost.org/doc/libs/1_55_0/doc/html/variant.html

下面是一个来自网页的例子:

代码语言:javascript
复制
std::vector< boost::variant<int, std::string> > vec;
vec.push_back( 21 );
vec.push_back( "hello " );

因此,容器的值类型可以是boost::variant<int, std::string>

票数 1
EN

Stack Overflow用户

发布于 2014-06-25 19:19:20

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

C++中的类型允许您使用编译器来选择应该对该类型表示的数据执行哪些操作。它们服务于另一个非常重要的目的,那就是向开发人员(可能是另一个开发人员,也许是您以后的开发人员)传达一些关于您期望对该类型表示的数据执行哪种类型的操作的含义。

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

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

联合将具有内存效率和节省(通常微不足道的) rtti开销的好处。

票数 1
EN

Stack Overflow用户

发布于 2014-06-25 18:51:23

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

代码语言:javascript
复制
union Compound {
    std::string str;
    int i;
    ~Compound() {}
};

一个使用它的运行示例:http://ideone.com/SUyyv1

另一件事:这两个变量都存储在同一个内存块中。如果只给出了一个int,它可能会产生一个段错误来读取string。你可以通过编写一个包含两个变量的类来修复这个问题,这个变量知道它包含的是string还是int。如果你把它写成一个模板版本,它可能会变成一个boost::variant等效项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24404276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档