我需要根据三个不同的标准访问一些数据,如下所示:
my_map["string1"]["string2"]["string3"]
现在我想知道以这种方式连接字符串是否有意义:
my_map["string1|string2|string2"]
这会节省查找操作的时间吗?还有其他重要因素需要考虑吗?
这样做可能不是一个好主意,主要有两个原因:
您可能应该寻找通过适当设计完成您想要的数据结构,例如tuples。
应该先查看您需要支持的用例,然后再提出问题。如果您的数据是分层的,并且您需要访问它的整个子部分(例如通过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" ) ];
正如 David Rodríguez 所指出的,与 .std::tie
一起使用时效率并不高[]
,但比std::make_shared
. 无论如何,当您使用 C++14 时,您将在未来受益,my_map.find( std::tie( "A", "B", "C" ) );
这将允许编译器省略复制字符串以进行查找。