C ++标准库是否具有“有序集”数据结构?通过有序集合,我的意思是与普通std::set
完全相同但会记住您向其添加项目的顺序。
如果没有,模拟一个的最佳方法是什么?我知道你可以做一些事情就像有一对配对,每一对都存储它所添加的数字和实际值,但如果有一个更简单的解决方案,我不想跳过箍。
答案 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)
是的,它被称为向量或列表(或数组)。只需附加向量即可将元素添加到集合中。