метод очистки очереди приоритетов - PullRequest
33 голосов
/ 17 мая 2010

Как удалить все элементы из приоритетной очереди? Это означает, как я могу уничтожить приоритетную очередь? заранее спасибо за ваш ответ. Есть ли какой-либо чистый или стирающий метод?

Ответы [ 4 ]

48 голосов
/ 17 мая 2010

Интерфейс priority_queue не имеет метода clear () (без веской причины, которую я когда-либо мог различить). Простой способ очистить его - просто назначить новую пустую очередь:

priority_queue <int> q;
// use it
q = priority_queue <int>(); // reset it
6 голосов
/ 16 января 2013

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;
}
4 голосов
/ 28 ноября 2017

Вот простой и понятный способ очистки любых priority_queuequeue, а также большинства других контейнеров):

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);
0 голосов
/ 17 мая 2010

Как показывает любая ссылка на C ++ STL, класс очереди приоритета STL не имеет функции типа «очистить» или «стереть». http://www.cplusplus.com/reference/stl/priority_queue/

Это контейнерный класс, и поэтому компилятор генерирует очень простой деструктор (в большинстве случаев). Если ваша приоритетная очередь использует только локально распределенную информацию в своих узлах, то это должно работать нормально для очистки памяти.

Однако, если у вас есть динамически распределенная память для информации в очереди с приоритетами, вам нужно будет вручную создать функцию «очистки».

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...