2010-05-17 3 views

ответ

40

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

priority_queue <int> q; 
// use it 
q = priority_queue <int>(); // reset it 
+0

это работает с очередью, но не с приоритетной очередью. – russell

+2

@ russell Что заставляет вас думать об этом? Все контейнеры и адаптеры стандартной библиотеки могут быть назначены. – 2010-05-17 19:52:31

+0

@Neil: Если приоритетная очередь была контейнером указателей, не должен ли владелец удалять каждый элемент? – andand

1

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

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

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

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

+2

В C++ "статические" не противоположность "динамический". Элементы в PQ не будут выделяться статически. – 2010-05-17 19:45:06

+0

А - хороший звонок по моему неправильному значению =) – bhilburn

6

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

Вот чистый и простой метод, чтобы очистить любые 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); 
Смежные вопросы