【问题标题】:Most efficient associative container with std::string as key?以 std::string 作为键的最有效的关联容器?
【发布时间】:2012-01-09 14:28:21
【问题描述】:

我在某处读到 std::map 仍然是我们在 STL 中最有效的关联容器,即使使用 std::unsorted_map ——从我在某处读到的内容来看,我不是确定 where-- 只有在有很多条目(例如超过 40k)时, find() 才会更有效。

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

简而言之:

如果我必须选择一个具有 unknown entry count 并以 std::string 作为键 的关联容器,那会是什么(至少在理论上)寻找更有效(速度)的选择?

【问题讨论】:

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

标签: c++ stl c++11


【解决方案1】:

个人资料,个人资料,个人资料...

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

例如,哈希实现可以选择仅使用固定数量的展开数字来计算哈希值,从而最终将一些几乎相同的字符串放在同一个桶中,因此这是一种权衡。您可能可以编造一组键值,这两个容器的性能都很差,但对于“随机”或“典型”字符串集合,我的赌注是散列容器。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 2011-06-23
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多