我需要根据三个不同的标准访问一些数据,如下所示:
my_map["string1"]["string2"]["string3"]现在,我想知道以这种方式连接字符串是否有意义:
my_map["string1|string2|string2"]这样会节省查找操作的时间吗?还有其他重要的因素要考虑吗?
发布于 2013-10-21 20:24:13
这个问题应该先看一下你需要支持的用例。如果您的数据是分层的,并且您需要访问它的整个子部分(比如传递my_map["criteria1"],您应该坚持使用第一个版本)。
如果情况不是这样,并且只有一个具有三个正交条件的大数据集,则可以优化访问。串连字符串不是最好的方法,因为它为复制和连接字符串创建了一定的开销,您需要小心分隔符,甚至可能要求您转义某些字符,这会带来更多的开销和更多的复杂性,这意味着:更多的bug。相反,您希望将这三个条件存储在一个合适的键类型中: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íguez)所指出的那样,std::tie与[]一起使用并不能买到多少效率,但它比std::make_shared更短。无论如何,将来使用C++14时,当您使用允许编译器省略复制字符串以进行查找的my_map.find( std::tie( "A", "B", "C" ) );时,您将有一个好处。
发布于 2013-10-21 20:15:08
出于两个主要原因,这么做可能不是个好主意:
您可能应该寻找使用适当设计(如tuples )来实现所需功能的数据结构。
https://stackoverflow.com/questions/19503648
复制相似问题