c++标准库是否有按插入顺序排序的集合
Does the C++ standard library have a set ordered by insertion order?
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
中(参见参考文档)。
是的,它被称为向量或列表(或数组)。
- 在自定义程序中使用本机 Windows 自然顺序排序
- C++ 按数值对元组<字符串、浮点数>然后按字典顺序排序的向量
- 在 C++ 中,以相反顺序排序的最快方法是什么?
- 按字母顺序排序字符数组,然后按长度排序
- 按第一个值的递减顺序对一组对进行排序,然后按第二个值的字母顺序排序
- C 在向量的向量中按字母顺序排序字符串
- 双链表中按字母顺序排序的链接
- 从文件中读取并按字母顺序排序
- 按字母顺序排序阵列C
- 构造函数的初始值设定项列表中的函数调用是否按顺序排序?
- 使用指针数组按字母顺序排序
- 按字母顺序排序,带有 å ä ö
- 按字母顺序排序名称,数组错误
- 如何从对数字进行排序到按C++字母顺序排序
- 从文件C++中按字母顺序排序
- 无法实现从文件按字符串 C++ 中的字母顺序排序的函数
- 并发消息处理按时间顺序排序
- 如何在 std::vector 中查找重复项<strings>并返回一个 std::list 它们按字母顺序排序,在该结果列表中没有重复项
- C++按字母顺序排序字符串
- 按字母顺序排序JSON值