如何删除优先级队列中的所有元素?这意味着如何销毁优先级队列?高级感谢您的回答。有没有类似清除或擦除的方法?
cmssoen21#
priority_queue接口没有clear()方法(我一直没能看出原因)。一个简单的方法就是分配一个新的空队列:
priority_queue <int> q; // use it q = priority_queue <int>(); // reset it
uttx8gqw2#
priority_queue没有一个clear方法。这可能是为了接口的简单性,也可能是因为在某些情况下,元素必须按优先级顺序销毁,这使得通用的clear函数不安全。无论如何,下面的代码块包含了两个清除优先级队列的函数。第一个函数的工作原理是围绕priority_queue构建一个 Package 类的临时示例,然后使用它来访问底层存储对象,假设它有一个clear()方法。第二个函数的工作原理是用一个新的队列替换现有的priority_queue。我使用模板,这样函数就可以一次又一次地循环使用。
priority_queue
clear()
#include <queue> #include <iostream> using namespace std; template <class T, class S, class C> void clearpq(priority_queue<T, S, C>& q) { struct HackedQueue : private priority_queue<T, S, C> { static S& Container(priority_queue<T, S, C>& q) { return q.*&HackedQueue::c; } }; HackedQueue::Container(q).clear(); } template <class T, class S, class C> void clearpq2(priority_queue<T, S, C>& q){ q=priority_queue<T, S, C>(); } int main(){ priority_queue<int> testq, testq2; //Load priority queue for(int i=0;i<10;++i) testq.push(i); testq2=testq; //Establish it is working cout<<testq.top()<<endl; testq.pop(); cout<<testq.top()<<endl; testq.pop(); //Clear it and prove that it worked clearpq(testq); cout<<testq.size()<<endl; //Use the second clearing function cout<<testq2.size()<<endl; clearpq2(testq2); cout<<testq2.size()<<endl; }
n3schb8v3#
这里有一个干净简单的方法来清除任何priority_queue(和queue,以及大多数其他容器):
queue
template <class Q> void clearQueue(Q & q) { q = Q(); }
因为它是一个模板,所以您不必记住所有的模板参数。示例:
std::priority_queue<MyType> simpleQueue; std::priority_queue<MyType, std::deque<MyType>, MyHashFunction> customQueue; // ... later ... clearQueue(customQueue); clearQueue(simpleQueue);
lymgl2op4#
正如任何C++ STL参考将向您展示的那样,STL优先级队列类没有类似'clear'或'erase'的函数。http://www.cplusplus.com/reference/stl/priority_queue/它是一个容器类,因此,编译器会生成一个非常简单的析构函数(在大多数情况下)。如果优先级队列在其节点中只使用本地分配的信息,那么这应该可以很好地清除内存。但是,如果您已经为优先级队列中的信息动态分配了内存,则需要手动创建一个类似于“clear”的函数。希望这有帮助!
3z6pesqy5#
priority_queue<int> a; a.push(10); a.push(9); a.push(8); a = {}; a.push(1); a.push(4); a.push(6); while(!a.empty()) { std::cout<< a.top(); a.pop(); }
导致
641
所以你可以简单地
a = {};
nhhxz33t6#
你可以使用std::priority_queue::c方法与std::vector::clear方法结合使用,或者分配一个新的容器来清除优先级队列的内容。下面是一个例子:
#include <iostream> #include <queue> #include <vector> template <typename T> class MyPriorityQueue : public std::priority_queue<T> { public: void clear() { this->c = std::vector<T>(); } }; int main() { MyPriorityQueue<int> pq; pq.push(1); pq.push(2); pq.push(3); pq.clear(); std::cout << "The priority queue is now empty" << std::endl; return 0; }
根据容器的大小,您可能只是从队列中弹出元素,因为它可能比内存分配更快,因此您必须测试两种方法并比较经验结果
2ul0zpep7#
在c++中没有支持清除优先级队列的方法,但是下面的方法是清除优先级队列的好方法,并且具有O(log(n))时间
while (!pq.empty()) pq.pop();
7条答案
按热度按时间cmssoen21#
priority_queue接口没有clear()方法(我一直没能看出原因)。一个简单的方法就是分配一个新的空队列:
uttx8gqw2#
priority_queue
没有一个clear方法。这可能是为了接口的简单性,也可能是因为在某些情况下,元素必须按优先级顺序销毁,这使得通用的clear函数不安全。无论如何,下面的代码块包含了两个清除优先级队列的函数。第一个函数的工作原理是围绕priority_queue构建一个 Package 类的临时示例,然后使用它来访问底层存储对象,假设它有一个
clear()
方法。第二个函数的工作原理是用一个新的队列替换现有的priority_queue。我使用模板,这样函数就可以一次又一次地循环使用。
n3schb8v3#
这里有一个干净简单的方法来清除任何
priority_queue
(和queue
,以及大多数其他容器):因为它是一个模板,所以您不必记住所有的模板参数。
示例:
lymgl2op4#
正如任何C++ STL参考将向您展示的那样,STL优先级队列类没有类似'clear'或'erase'的函数。http://www.cplusplus.com/reference/stl/priority_queue/
它是一个容器类,因此,编译器会生成一个非常简单的析构函数(在大多数情况下)。如果优先级队列在其节点中只使用本地分配的信息,那么这应该可以很好地清除内存。
但是,如果您已经为优先级队列中的信息动态分配了内存,则需要手动创建一个类似于“clear”的函数。
希望这有帮助!
3z6pesqy5#
导致
所以你可以简单地
nhhxz33t6#
你可以使用std::priority_queue::c方法与std::vector::clear方法结合使用,或者分配一个新的容器来清除优先级队列的内容。下面是一个例子:
根据容器的大小,您可能只是从队列中弹出元素,因为它可能比内存分配更快,因此您必须测试两种方法并比较经验结果
2ul0zpep7#
在c++中没有支持清除优先级队列的方法,但是下面的方法是清除优先级队列的好方法,并且具有O(log(n))时间