首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >map<string1,map<string2,map<string3,string> >是否比将字符串连接到map<string1string2string3,string>慢?

map<string1,map<string2,map<string3,string> >是否比将字符串连接到map<string1string2string3,string>慢?
EN

Stack Overflow用户
提问于 2013-10-21 20:03:37
回答 2查看 249关注 0票数 6

我需要根据三个不同的标准访问一些数据,如下所示:

代码语言:javascript
复制
my_map["string1"]["string2"]["string3"]

现在,我想知道以这种方式连接字符串是否有意义:

代码语言:javascript
复制
my_map["string1|string2|string2"]

这样会节省查找操作的时间吗?还有其他重要的因素要考虑吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-21 20:24:13

这个问题应该先看一下你需要支持的用例。如果您的数据是分层的,并且您需要访问它的整个子部分(比如传递my_map["criteria1"],您应该坚持使用第一个版本)。

如果情况不是这样,并且只有一个具有三个正交条件的大数据集,则可以优化访问。串连字符串不是最好的方法,因为它为复制和连接字符串创建了一定的开销,您需要小心分隔符,甚至可能要求您转义某些字符,这会带来更多的开销和更多的复杂性,这意味着:更多的bug。相反,您希望将这三个条件存储在一个合适的键类型中:std::tuple

您的地图可能看起来像(给定的是某种类型的X存储值):

代码语言:javascript
复制
using my_key_type = std::tuple<std::string,std::string,std::string>;
std::map< my_key_type, X > my_map;

添加值的工作方式如下:

代码语言:javascript
复制
my_map.emplace( my_key_type( "A", "B", "C" ), x ); // x is a value of type X

可以通过以下方法有效地进行查找:

代码语言:javascript
复制
X x = my_map[ std::tie( "A", "B", "C" ) ];

正如大卫·罗德里格斯( Davidíguez)所指出的那样,std::tie[]一起使用并不能买到多少效率,但它比std::make_shared更短。无论如何,将来使用C++14时,当您使用允许编译器省略复制字符串以进行查找的my_map.find( std::tie( "A", "B", "C" ) );时,您将有一个好处。

票数 4
EN

Stack Overflow用户

发布于 2013-10-21 20:15:08

出于两个主要原因,这么做可能不是个好主意:

  • 它使你身后的人更加难以理解和复杂。
  • 当有人在其中一个字符串中放置分隔符时,带内信令将为您打开各种有趣的安全漏洞。

您可能应该寻找使用适当设计(如tuples )来实现所需功能的数据结构。

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

https://stackoverflow.com/questions/19503648

复制
相关文章

相似问题

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