C ++标准库是否按插入顺序排序?

时间:2011-10-18 00:18:16

标签: c++ stl set c++-standard-library

C ++标准库是否具有“有序集”数据结构?通过有序集合,我的意思是与普通std::set完全相同但会记住您向其添加项目的顺序。

如果没有,模拟一个的最佳方法是什么?我知道你可以做一些事情就像有一对配对,每一对都存储它所添加的数字和实际值,但如果有一个更简单的解决方案,我不想跳过箍。

6 个答案:

答案 0 :(得分:17)

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

最好,干净的方法可能类似于Boost.MultiIndex,它允许您在容器上添加多个索引或“视图”,因此您可以拥有顺序索引和有序索引。

答案 1 :(得分:7)

为什么不传递一个std ::对象和一个在每次插入时递增的索引,而不是制作你正在使用的任何类型的std :: set?

答案 2 :(得分:3)

不,它没有。

这样的容器大概需要两个不同的迭代器,一个迭代器按照添加顺序定义的顺序迭代,另一个迭代器按照通常的set顺序迭代。标准库中没有任何类似的东西。

模拟它的一个选项是让某个类型的set除了您关心的实际数据外还包含一个侵入式链表节点。向set添加元素后,将其附加到链接列表。在从set中删除元素之前,请将其从链接列表中删除。这保证是正常的,因为除了删除该元素之外的任何操作都不会使指向set元素的指针无效。

答案 3 :(得分:0)

我认为答案很简单,将set与另一个可迭代结构(比如队列)结合起来。如果你想按插入元素的顺序迭代集合,先按队列中的元素,在前面的元素上做你的工作,然后弹出,放入集合。

答案 4 :(得分:0)

[免责声明:我已经对this question给出了类似的答案]

如果可以使用Boost,一个非常简单的解决方案是使用仅标头的库Boost.Bimap(双向映射)。

请考虑以下示例程序,该示例程序将按插入顺序(try out here)显示一些虚拟条目:

#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中(请参阅参考文档)。

答案 5 :(得分:-4)

是的,它被称为向量或列表(或数组)。只需附加向量即可将元素添加到集合中。