map <string1,map <string2,=“”map <string3,=“”string =“”>&gt; &GT;比连接字符串要慢地映射<string1stringtringstring3,string =“”>?</string1string2string3,> </string1,>

时间:2013-10-21 20:03:37

标签: c++ map stl

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

my_map["string1"]["string2"]["string3"]

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

my_map["string1|string2|string2"]

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

2 个答案:

答案 0 :(得分:8)

这可能不是一个好主意,主要有两个原因:

  • 它让那些落后于你的人更加难以理解和复杂
  • 当有人在其中一个字符串中放入分隔符时,
  • 带内信令为您提供各种有趣的安全漏洞

您应该寻找能够通过适当设计做到所需的数据结构,例如tuples

答案 1 :(得分:4)

在问题出现之前,应先查看需要支持的用例。如果您的数据是分层的,并且您需要访问它的整个子部分(比如传递my_map["criteria1"],那么您应该坚持使用第一个版本。

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

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

using my_key_type = std::tuple<std::string,std::string,std::string>;
std::map< my_key_type, X > my_map;

添加值的方式如下:

my_map.emplace( my_key_type( "A", "B", "C" ), x ); // x is a value of type X

可以通过以下方式有效地完成查找:

X x = my_map[ std::tie( "A", "B", "C" ) ];

正如DavidRodríguez所指出的,std::tie[]一起使用效率不高,但它比std::make_shared短。无论如何,当你使用my_map.find( std::tie( "A", "B", "C" ) );时,你将在C ++ 14中获益,这将允许编译器省略复制字符串以进行查找。