如何从优先级队列中删除所有元素?这意味着如何销毁优先级队列? 谢谢您的回答。是否有任何类似于清除或擦除的方法?
答案 0 :(得分:46)
priority_queue接口没有clear()方法(没有任何理由我曾经能够辨别)。清除它的一种简单方法就是分配一个新的空队列:
priority_queue <int> q;
// use it
q = priority_queue <int>(); // reset it
答案 1 :(得分:6)
priority_queue
没有明确的方法。这可能是因为界面简单,或者因为可能存在必须按优先级顺序销毁元素的情况,使得通用的清除函数不安全。
无论如何,以下代码块包括清除优先级队列的两个功能。第一种方法是在priority_queue周围构建一个包装类的临时实例,然后使用它来访问底层存储对象,假设它有一个clear()
方法。第二种方法是将现有priority_queue替换为新队列。
我使用模板,以便可以一次又一次地回收这些功能。
#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;
}
答案 2 :(得分:0)
正如任何C ++ STL引用将向您显示的那样,STL Priority Queue类没有“clear”或“erase”之类的函数。 http://www.cplusplus.com/reference/stl/priority_queue/
它是一个容器类,因此,编译器会生成一个非常简单的析构函数(在大多数情况下)。如果您的优先级队列在其节点中仅使用本地分配的信息,那么这应该可以正常清除内存。
但是,如果您为优先级队列中的信息动态分配了内存,则需要手动创建一个类似“清除”的函数。
希望这有帮助!
答案 3 :(得分:0)
在c ++中,没有对priority_queue支持的清除方法,但是下面的方法是清除priority_queue的好方法,并且具有O(log(n))时间
while (!pq.empty())
pq.pop();
答案 4 :(得分:0)
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 = {};