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;
}