C++ 使用std::string作为键的最有效的关联容器?

C++ 使用std::string作为键的最有效的关联容器?,c++,stl,c++11,C++,Stl,C++11,我在某个地方读到过std::map,在当前的编译器中,它仍然是STL中最有效的关联容器,即使是std::unsorted_map,从我在某个地方读到的,我不确定在哪里读到的,只有当有很多条目(比如超过40k条)时,它在find()上才会变得更有效 所以现在我不确定了,因为我一直认为哈希映射更有效,至少在字符串键的情况下是这样 简而言之: 如果我必须选择一个具有未知条目计数和std::string作为键的关联容器,那么(至少在理论上)查找的效率(速度)更高的选择是什么?Profile,Profil

我在某个地方读到过std::map,在当前的编译器中,它仍然是STL中最有效的关联容器,即使是std::unsorted_map,从我在某个地方读到的,我不确定在哪里读到的,只有当有很多条目(比如超过40k条)时,它在find()上才会变得更有效

所以现在我不确定了,因为我一直认为哈希映射更有效,至少在字符串键的情况下是这样

简而言之:


如果我必须选择一个具有未知条目计数和std::string作为键的关联容器,那么(至少在理论上)查找的效率(速度)更高的选择是什么?Profile,Profile,Profile

字符串作为键的问题是比较它们非常慢(想想1000个字符字符串中最后一个字符的差异)。带有字符串键的
无序映射
的优势至少部分来自这样一个事实,即只需比较固定宽度的散列值,因此在实践中无序映射可能会快得多


例如,散列实现可以选择仅使用固定数量的分散数字来计算散列值,从而在同一个桶中放置一些几乎相同的字符串,因此这是一种折衷。您可能会捏造一组键值,但对于“随机”或“典型”字符串集合,我的赌注是哈希容器。

当您有40k个或更多条目时,字符串(或元素列表等)不应在标准容器中用作关联键。相反,更早的时候,trie或三元树成为更好的选择。这两种方法都可以构建关联结构,只对字符串中的每个字符(或列表中的元素等)进行一次比较。有序映射在每个节点上进行比较(O(m logn)-m字符串大小,n个元素数也是如此),而无序映射在这些大小上遭受的冲突要多得多


三元树(每个子树在单个字符比较中分支为更少、相等或更大的字符)占用的内存比更好的实现最少,但尝试的速度最快。这两个都可以从boost.graph或其他一些通用图形库中构建。

您所说的效率是什么意思-空间、插入速度、查找速度?STL没有无序映射,您可能在谈论C++11标准库,因此有许多不同的实现,因此,什么更快取决于您的工作负载和使用的实现(可能还有编译器设置)。任何答案都取决于使用模式和实现。它们提供这两个函数主要是因为两者都不是可靠的“更好”。@PlasmaHH:如果使用正确,STL通常指包含函子、算法、迭代器和容器的标准库子部分。@Xeo:根据谁正确?我在标准中找不到定义STL的术语。