Подтвердить что ты не робот

Метод приоритетной очереди

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

4b9b3361

Ответ 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_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);

Ответ 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();