小智 52
priority_queue接口没有clear()方法(没有任何理由我曾经能够辨别).清除它的一种简单方法就是分配一个新的空队列:
priority_queue <int> q;
// use it
q = priority_queue <int>(); // reset it
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28065 次 |
| 最近记录: |