【问题标题】:Which STL structure to use?使用哪种 STL 结构?
【发布时间】:2013-03-29 06:32:24
【问题描述】:

我需要一个解决方案,它将存储非唯一的键值对。我不想重复键(空间效率),我想专注于查找速度(插入新数据的效率不太重要)。我将在这里使用 std::multimap 。但我将不得不查找符合某些范围标准的键。

最复杂的例子: 键是字符串,值不重要。 我想找出所有值,哪些键以“Lol”开头。 或者我想找出所有值,哪些键“介于”“bar”和“foo”之间。

我可以用多张地图来做吗?我的第二个想法是使用排序向量,它将指向值向量。类似的东西:

std::vector<std::string, std::vector<T>> sorted_vec;

然后我可以轻松满足搜索条件。但我真的很关心查找的性能。这是一个正确的方法吗?

【问题讨论】:

  • 听起来有序的向量图更符合您所描述的路线,但我不确定它是否适合您。
  • 如果插入不重要,我认为vectormap 更受欢迎,因为后者是基于 rb-tree 的。 struct foo {}; vector&lt;foo&gt;; 可能没问题。

标签: c++ stl containers


【解决方案1】:

或者我想找出所有值,哪些键“介于”“bar”和“foo”之间。

如果你有 Boost,我建议使用boost::flat_map(它只是标头库)- 它维护sorted vector inside。通常,由于更好的紧凑性/局部性,它比 std::map 具有更好的查找能力。

否则使用

vector<pair<string,value>>
or
vector<pair<string,vector<value>>> //(for re-use of keys)
// instead of pair, you may use just struct if you concerned with lexicographical compare

std::sort

加上std::equal_range/lower_bound

【讨论】:

    【解决方案2】:

    您应该使用Patricia trie

    one in libstdc++,虽然它不是标准的。

    如果您要坚持使用标准容器,我认为您的排序向量解决方案是最好的。

    【讨论】:

      【解决方案3】:

      是的,您可以使用 std::multimap。 为了完成你的范围基查询,你可以在头文件算法中使用 std::lower_bound 和 std::upper_bound 这两种算法。

      【讨论】:

      • 我想我在lower_bound和upper_bound上弄错了。这两种算法对multimap迭代器无效。请改用 multimap::lower_bound 和 multimap::upper_bound。
      • 首先,因为 Dejwi 需要“键在 bar 和 foo 之间” - 那么equal_range 会比 lower_bound + upper_bound 更好。其次,因为他“真正关心查找的性能” - 多图是不好的选择 - 由于更好的局部性,排序向量会更快。
      猜你喜欢
      • 2017-10-27
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多