【问题标题】:C+11 Associative Container that keeps insertion order?C+11 保持插入顺序的关联容器?
【发布时间】:2013-09-21 05:27:17
【问题描述】:

在 c++“标准库”中,是否有任何“关联”(即“键值”)容器/数据结构能够按插入顺序保持顺序?

我已经看到了几个关于此的主题,但是,似乎大多数在 C++11 之前。

有些人建议使用“boost::multi_index”,但如果可能的话,我会“宁愿”使用标准容器/结构。

我看到 C++11 有几个显然是“无序”的关联容器:link。

这些中的任何一个在某种程度上是“可配置的”,以便它们仅按插入顺序排序吗?

谢谢!

C

【问题讨论】:

  • 只使用 unordered_map 和 vector 一起
  • 您在寻找std::vector< std::pair< K , V > >吗?
  • 所以你想要相当于 Java 的 LinkedHashMap?
  • @aaronman 仅在您不使用需要法线贴图界面的函数修改贴图时才有效。中间的移除也会慢很多,需要移动整个向量。如果两者都不是问题,那么当然。
  • 我为此使用 boost::MultiIndex 并且效果很好。虽然在某些情况下我不想有额外的依赖。

标签: c++ c++11 stl containers


【解决方案1】:

没有。

您正在混合线性访问和随机访问。不是很好的床伴。

只需同时使用vector/list(即插入顺序)和使用前者索引的映射。

【讨论】:

  • 他们是非常好的伙伴,很高兴有什么时候需要这个,而且拥有这样的容器在实现方面也是微不足道的。如果 C++ 没有,我有点惊讶。示例:docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html
  • @hyde - 它只是将两个数据结构链接在一起。两个 - 不是一个。
  • Hashmap 在内部已经是几种数据结构的组合,所以我看不出有什么区别......插入有序的 hashmap 仍然需要相当多的代码,应该包装在一个类中当然必须提供与普通无序 hashmap 完全相同的接口。请注意,与保持排序顺序不同,保持插入顺序不会影响算法效率。
【解决方案2】:

没有;这种能力显然是以性能为名牺牲的。

需要在包括重新散列在内的操作中保留等效项的顺序,但无法指定原始顺序。理论上,您可以在每次插入后使用std::rotate 或类似方法将对象排列为所需的顺序。显然不切实际,但证明能力不足有点武断。

最好的办法是将子序列保存在内部容器中。您可以使用迭代器适配器来迭代这样一个“深层”容器,就好像它是一个序列一样。这样的实用程序可能可以在 Boost 中找到。

【讨论】:

    【解决方案3】:

    没有。 在无序映射中也是如此,没有按照插入的顺序存储。

    您可以使用vector来跟踪key!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      相关资源
      最近更新 更多