Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;对于以合理速度排序的基于索引的访问,是否存在默认数据类?_C++_Sorting_Data Structures_Queue_Priority Queue - Fatal编程技术网

C++ c++;对于以合理速度排序的基于索引的访问,是否存在默认数据类?

C++ c++;对于以合理速度排序的基于索引的访问,是否存在默认数据类?,c++,sorting,data-structures,queue,priority-queue,C++,Sorting,Data Structures,Queue,Priority Queue,我正在寻找一个dataclass,它可以保持数据的有序性,但也允许以我想要的任何顺序进行访问 基本上,我正在寻找一个队列,它允许我以随机顺序访问项目,并保持顺序(int从低到高)。当添加项目时,它不应该求助于所有操作(O(n*log(n))操作),而是以一种快速的方式插入和删除它(O(log(n)))。我知道这样的数据结构存在(基于二进制树的队列),但是C++提供了一个吗?我当前的应用程序要求我可以做一些事情,比如从队列/项目列表中选择中间项,或者选择优先级第二高的项目。C++是否有默认数据类?

我正在寻找一个dataclass,它可以保持数据的有序性,但也允许以我想要的任何顺序进行访问

基本上,我正在寻找一个队列,它允许我以随机顺序访问项目,并保持顺序(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;
向量v; //插入元素 v、 推回(3); 推送堆(v.begin(),v.end()); v、 推回(2); 推送堆(v.begin(),v.end()); v、 推回(4); 推送堆(v.begin(),v.end()); //拿第二个大的 排序堆(v.begin(),v.end());
你不能自己做吗


围绕std::vector创建包装器。根据需要添加委托给向量的方法,对于插入方法,请调用std::upper_bound查找插入位置。

否,标准库中不存在此类结构。我也不认为它存在于boost中,但看着它也不会有什么坏处


否则,这种结构在概念上是简单的——某种平衡的搜索树(可能是a-b或红黑),它还需要维护节点中的子节点数量(这可能使a和b较高的a-b树比2-3或红黑更合适。但似乎没有任何东西可以帮助您实现它。

当您说“允许我以随机顺序访问项目”时,您是指通过索引访问吗?是的,这意味着通过索引访问(给我第三项)如果数据类型的复制成本不高,您可能会发现插入后排序的向量实际上比映射快。不,这样的数据结构不存在。很少需要这样的东西。您能概述一下需要它的算法吗?也许可以修改它以使其更易于实现。按索引(请给我第三个最高的数字)注意堆不是排序的。它只调整最大的(大多数文本定义堆在根中有最小的元素,但是C++必须不同;好,你总是可以反转比较)。在第一个根元素中。但其他元素的顺序是半随机的。priority_queue包装了push_堆、sort_堆等函数,因此您可以使用一个容器来完成所有这一切。但是堆的问题是,只能保证第一个元素是最大的。其余元素的顺序是dependant@ScottLangham:请把描述读到底:“范围作为堆丢失了它的属性。”在每一步之后都不可用。@Jan Hudec&Scott Langham,你注意到结尾的描述了吗“但是每次你想以随机顺序访问项目之前,你必须对堆进行排序”。“sort\u heap”是关键,我认为它没有那么昂贵,因为正如Jan Hudec所说的,其他元素是半随机顺序的。只有当你想得到不是最大的元素时,才需要“sort\u heap”。@Edmund:问题是,在你调用
sort\u heap
之后,你得到的是一个排序数组,它不是堆(排序顺序是颠倒的)。因此,算法必须反转(使用O(n)操作)数组才能继续。您是否注意到问题中的“添加项目时,它不应该使用所有(O(n*log(n))操作)”吗?@Jan Hudec。啊,是的,对不起!但是插入仍然是O(n)。有点帮助,但不多。Boost有一个平面图/设置实现此功能的容器:尽管如此,它仍然有O(n)个insert(与映射的O(log(n))相比)。