c++标准库是否有按插入顺序排序的集合

Does the C++ standard library have a set ordered by insertion order?

本文关键字:顺序 排序 集合 插入 标准 是否 c++      更新时间:2023-10-16

c++标准库有"有序集"数据结构吗?所谓有序集合,我指的是与普通的std::set完全相同的东西,但它记住了你向其中添加元素的顺序。

如果没有,最好的模拟方法是什么?我知道你可以做一些事情,比如有一组对,每对存储添加的数字和实际值,但如果有一个更简单的解决方案,我不想跳圈。

没有单一的同构数据结构具有此属性,因为它要么是顺序的(即元素按插入顺序排列),要么是关联的(元素根据值按某种顺序排列)。

最好的、干净的方法可能是Boost之类的东西。MultiIndex,它允许您在容器上添加多个索引或"视图",因此您可以拥有顺序和有序的索引。

与其使用任何类型的std::set,不如将对象的std::对和每次插入时递增的索引传递给它?

不,它没有。

这样的容器可能需要两个不同的迭代器,一个按照加法顺序定义的顺序进行迭代,另一个按照通常的set顺序进行迭代。在标准库中没有这样的东西。

模拟它的一个选项是拥有某种类型的set,除了您关心的实际数据外,还包含一个侵入式链表节点。将元素添加到set后,将其附加到链表中。在从set中删除一个元素之前,先从链表中删除它。这可以保证是正确的,因为指向set元素的指针除了删除该元素外,不会被任何操作失效。

我认为答案相当简单,将set与另一个可迭代结构(例如queue)结合起来。如果您希望按照元素插入的顺序迭代set,请先将元素推入队列,处理前面的元素,然后弹出,放入set。

[免责声明:我已经对这个问题给出了类似的答案]

如果可以使用Boost,一个非常直接的解决方案是使用仅头文件库Boost。bimmap(双向映射).

考虑以下示例程序,它将按插入顺序显示一些虚拟条目(在这里尝试):

#include <iostream>
#include <string>
#include <type_traits>
#include <boost/bimap.hpp>
using namespace std::string_literals;
template <typename T>
void insertByOrder(boost::bimap<T, size_t>& mymap, const T& element) {
  using pos = typename std::remove_reference<decltype(mymap)>::type::value_type;
  // We use size() as index, therefore indexing the elements with 0, 1, ...
  mymap.insert(pos(element, mymap.size()));
}
int main() {
  boost::bimap<std::string, size_t> mymap;
  insertByOrder(mymap, "stack"s);
  insertByOrder(mymap, "overflow"s);
  // Iterate over right map view (integers) in sorted order
  for (const auto& rit : mymap.right) {
    std::cout << rit.first << " -> " << rit.second << std::endl;
  }
}

需要insertByOrder()中时髦的类型别名来将元素插入到下一行的boost::bimap中(参见参考文档)。

是的,它被称为向量或列表(或数组)。