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

6 c++ stl map

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

my_map["string1"]["string2"]["string3"]
Run Code Online (Sandbox Code Playgroud)

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

my_map["string1|string2|string2"]
Run Code Online (Sandbox Code Playgroud)

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

Ola*_*the 8

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

  • 对于那些落后于你的人来说,它会使事情更加难以理解和复杂化
  • 当有人在其中一个字符串中放置分隔符时,带内信令可以让您获得各种有趣的安全漏洞

您可能应该寻找通过适当设计(如元组)执行所需操作的数据结构.


Dan*_*rey 4

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

\n\n

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

\n\n

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

\n\n
using my_key_type = std::tuple<std::string,std::string,std::string>;\nstd::map< my_key_type, X > my_map;\n
Run Code Online (Sandbox Code Playgroud)\n\n

添加值的工作方式如下:

\n\n
my_map.emplace( my_key_type( "A", "B", "C" ), x ); // x is a value of type X\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
X x = my_map[ std::tie( "A", "B", "C" ) ];\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如 David Rodr\xc3\xadguez 所指出的,std::tie与 一起使用时并不会带来太多效率[],但它比 更短std::make_shared。无论如何,当您使用 C++14 时,您将来将会受益my_map.find( std::tie( "A", "B", "C" ) );这将允许编译器省略复制字符串以进行查找。

\n