2010-05-17 10 views
29

¿Cómo elimino todos los elementos de una cola de prioridad? Eso significa ¿cómo puedo destruir una cola de prioridad? avanzado gracias por su respuesta. ¿Hay algún método claro o borrado?método de limpieza de cola de prioridad

Respuesta

40

La interfaz priority_queue no tiene un método clear() (sin ninguna buena razón que alguna vez haya podido discernir). Una forma sencilla de limpiar es sólo para asignar una nueva, cola vacía:

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

esto funciona con cola, pero no con cola de prioridad. – russell

+2

@russell ¿Qué te hace pensar eso? Todos los contenedores y adaptadores de la Biblioteca estándar son asignables. –

+0

@Neil: si la cola de prioridad era un contenedor de punteros, ¿no debería el propietario eliminar cada elemento? – andand

1

Como cualquier referencia de STL de C++ le mostrará, la clase de cola de prioridad de STL no tiene una función como 'borrar' o 'borrar'. http://www.cplusplus.com/reference/stl/priority_queue/

Es una clase contenedor, y como tal, el compilador genera un destructor muy simple (en la mayoría de los casos). Si su cola de prioridad usa solo información asignada localmente en sus nodos, entonces esto debería funcionar bien para borrar la memoria.

Sin embargo, si ha asignado dinámicamente memoria para la información en su cola de prioridad, tendrá que crear manualmente una función de tipo 'borrar'.

Espero que esto ayude!

+2

En C++ "estática" no es lo contrario de "dinámica". Los elementos en un PQ no se asignarán estáticamente. –

+0

Ah - buena llamada en mi nombre inapropiado =) – bhilburn

6

priority_queue no tiene un método claro. Puede ser que esto se deba a la simplicidad de la interfaz, o porque puede haber situaciones en las que los elementos se deben destruir en orden de prioridad, lo que hace que una función clara genérica no sea segura.

Independientemente, el siguiente bloque de código incluye dos funciones para borrar las colas de prioridad. El primero funciona construyendo una instancia temporal de una clase contenedora alrededor de la priority_queue y luego usándola para acceder al objeto de almacenamiento subyacente, que se supone que tiene un método clear(). El segundo funciona reemplazando la priority_queue existente por una nueva cola.

Utilizo plantillas para que las funciones se puedan reciclar una y otra vez.

#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

Aquí es un método limpio y sencillo para borrar cualquier priority_queue (y queue, y la mayoría de otros recipientes, así):

template <class Q> 
void clearQueue(Q & q) { 
    q = Q(); 
} 

Ya que es una plantilla, no tiene que recordar todo el parámetros de la plantilla.

Ejemplo:

std::priority_queue<MyType> simpleQueue; 
std::priority_queue<MyType, std::deque<MyType>, MyHashFunction> customQueue; 

// ... later ... 

clearQueue(customQueue); 
clearQueue(simpleQueue); 
Cuestiones relacionadas