Как удалить все элементы из очереди приоритетов? Это означает, как я могу уничтожить очередь приоритетов? спасибо за ваш ответ. Есть ли какой-либо метод очистки или стирания?
Метод приоритетной очереди
Ответ 1
Интерфейс priority_queue не имеет метода clear() (без уважительной причины я когда-либо мог различить). Простым способом очистки является просто назначить новую пустую очередь:
priority_queue <int> q;
// use it
q = priority_queue <int>(); // reset it
Ответ 2
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;
}
Ответ 3
Здесь приведен чистый и простой способ очистки любых priority_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);
Ответ 4
Как будет показано в любой ссылке С++ STL, класс Queue Priority Queue не имеет функции типа "clear" или "erase". http://www.cplusplus.com/reference/stl/priority_queue/
Это класс контейнера, и в этом случае компилятор генерирует очень простой деструктор (в большинстве случаев). Если ваша очередь приоритетов использует только локально распределенную информацию в своих узлах, тогда это должно работать нормально для очистки памяти.
Однако, если у вас есть динамически распределенная память для информации в вашей очереди приоритетов, вам нужно будет вручную создать "ясную" функцию.
Надеюсь, это поможет!
Ответ 5
нет никакого ясного метода, поддерживаемого для priority_queue в c++, но это ниже - хороший способ очистить priority_queue и имеет время O (log (n))
while (!pq.empty())
pq.pop();