c++是否有一个默认的数据类,用于以合理的速度对基于索引的访问进行排序
c++ is there a default data class for sorted index based acces at reasonable speed?
我正在寻找一个数据类,它可以按顺序保存数据,但也可以按我想要的任何顺序访问。
基本上,我正在寻找一个队列,它允许我以随机顺序访问项目,并保持顺序(int从最低到最高)。当添加项目时,它不应该求助于所有操作(O(n*log(n)),而只需要以快速的方式插入和删除它(O(log(n)))。我知道存在这样的数据结构(基于二叉树的队列),但c++提供了吗?我当前的应用程序要求我可以做一些事情,比如从队列/项目列表中居中,或者获得第二高优先级的项目。c++对此有默认的数据类吗?还是我必须自己做?
顺便说一下,这是c++98
我认为向量加堆就像您正在寻找的一样。
vector<int> v;
// insert elements
v.push_back(3);
push_heap(v.begin(), v.end());
v.push_back(2);
push_heap(v.begin(), v.end());
v.push_back(4);
push_heap(v.begin(), v.end());
// get the second big
sort_heap(v.begin(), v.end());
cout << v[v.size() - 2] << endl;
// insert elements
make_heap(v.begin(), v.end());
v.push_back(7);
push_heap(v.begin(), v.end());
// get the second big
sort_heap(v.begin(), v.end());
cout << v[v.size() - 2] << endl;
插入速度很快。但每次在您想要访问不是最大的项之前,您都必须对堆进行排序,因为堆只会给您最大的项。之后,在新插入之前,您必须调用make_heap
,使向量再次成为堆。
否,标准库中不存在这样的结构。我认为它也不存在于boost中,但看看boost.MultiIndex不会有什么坏处。
否则,这样的结构在概念上很简单——某种平衡的搜索树(可能是a-b或红黑),它还需要维护节点中的子树数量(这可能使a和b更高的a-b树比2-3或红黑更适合。但似乎没有任何东西可以帮助你实现它。
你必须自己制作。
围绕std::向量创建一个包装器。根据需要添加委托给向量的方法,对于插入方法,请调用std::upper_bound来查找插入位置。
相关文章:
- 数组索引的值没有增加
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 查找最接近的大于当前数字的数字的索引
- 在C++中调整向量中的索引
- 重载元组索引运算符-C++
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为std::string的某个索引赋值
- 并行用于C++17中数组索引范围内的循环
- 需要为SQLite3数据库创建索引(索引)
- C++相当于 Python 的:用于数组索引
- 我是否需要通过锁来保护对 Boost MultiIndex 索引(索引本身)的访问?
- 如何使用独立于索引的函数初始化向量
- C++相当于Perl的Tie::IxHash(索引关联数组)?
- 依赖于一个空std::string的索引0是不是不好?
- string何时会导致类似于c++中的NullPointerException或ArrayOutOfBound索引的错误
- 用负索引索引std::vector
- 在索引和值"for i, v in enumerate(listVar):"上是否有 C++/C++11 类似于 python 迭代?
- 如何获取相对于运行时索引的类型
- 将纹理应用于索引基元.c++ DX9
- 哪个子类对象存在于某个索引