Clase priority_queue
Una clase de adaptador de contenedor de plantilla que proporciona una restricción de la funcionalidad que limita el acceso al elemento superior de algún tipo de contenedor subyacente, que siempre es el más grande o el que tiene una prioridad más alta. Pueden agregarse nuevos elementos a priority_queue
y el elemento superior de priority_queue
puede inspeccionarse o quitarse.
Sintaxis
template <class Type, class Container= vector <Type>, class Compare= less <typename Container ::value_type>>
class priority_queue
Parámetros
Type
Tipo de datos de elementos que se va a almacenar en la priority_queue
.
Container
Tipo del contenedor subyacente que se usa para implementar priority_queue
.
Compare
Tipo que proporciona un objeto de función que puede comparar dos valores de elementos como claves de ordenación para determinar su orden relativo en priority_queue
. Este argumento es opcional y el predicado binario less<typename Container::value_type>
es el valor predeterminado.
Comentarios
Los elementos de la clase Type
estipulada en el primer parámetro de plantilla de un objeto de cola son sinónimos de value_type
y deben coincidir con el tipo de elemento de la clase de contenedor subyacente Container
estipulada por el segundo parámetro de plantilla. El Type
debe ser asignable, para que sea posible copiar objetos de ese tipo y asignar valores a variables de ese tipo.
El objeto priority_queue
ordena la secuencia que controla llamando a un objeto de función almacenado de clase Traits
. En general, se debe poder comparar si los elementos son menores que otros para poder establecer este orden; de este modo, dados dos elementos cualesquiera, se puede determinar que son equivalentes (en el sentido de que ninguno es menor que el otro) o que uno es menor que el otro. Esto produce una ordenación entre los elementos no equivalentes. En un sentido más técnico, la función de comparación es un predicado binario que induce una ordenación débil estricta en el sentido matemático estándar.
Las clases contenedoras subyacentes adecuadas para priority_queue
incluyen deque
(Clase) y la vector
clase (Clase) predeterminada, o cualquier otro contenedor de secuencias que admita las operaciones de front
, push_back
, and pop_back
y un iterador de acceso aleatorio. La clase de contenedor subyacente se encapsula dentro del adaptador de contenedor, que solo expone el conjunto limitado de las funciones miembro de contenedor de secuencias como una interfaz pública.
Agregar elementos y quitarlos de priority_queue
tiene una complejidad logarítmica. Tener acceso a elementos en priority_queue
tiene una complejidad constante.
Existen tres tipos de adaptadores de contenedor que se definen mediante la biblioteca estándar de C++: stack
, queue
y priority_queue
. Cada uno restringe la función de alguna clase de contenedor subyacente para proporcionar una interfaz controlada de manera precisa para una estructura de datos estándar.
La clase
stack
es compatible con una estructura de datos LIFO (el último en entrar es el primero en salir). Un buen símil sería una pila de platos. Solo se pueden insertar e inspeccionar elementos (platos) en la parte superior de la pila, que es el último elemento al final del contenedor base, y solo se pueden quitar de ahí. La restricción de acceder únicamente al elemento superior es el motivo por el que se usa la clasestack
.La clase
queue
es compatible con una estructura de datos FIFO (el primero en entrar es el primero en salir). Un buen símil sería el de personas que hacen cola en un banco. Se pueden agregar elementos (personas) a la parte posterior de la línea y quitarlos de la parte delantera de la línea. Se puede inspeccionar tanto la parte delantera como trasera de una línea. La restricción de acceder únicamente a los elementos delanteros y traseros de esta manera es el motivo por el que se usa la clasequeue
.La clase
priority_queue
ordena sus elementos de tal modo que el elemento más grande siempre esté en la parte superior. Admite la inserción de un elemento y la inspección y eliminación del elemento superior. Un buen símil sería el de personas alineadas y organizadas por edad, altura o cualquier otro criterio.
Constructores
Constructor | Descripción |
---|---|
priority_queue |
Construye un priority_queue que está vacío o que es una copia de un intervalo de un objeto contenedor base o de otro priority_queue . |
Typedefs
Nombre de tipo | Descripción |
---|---|
container_type |
Tipo que proporciona el contenedor base que debe adaptarse mediante una priority_queue . |
size_type |
Tipo entero sin signo que puede representar el número de elementos de un priority_queue . |
value_type |
Tipo que representa el tipo de objeto almacenado como elemento en una priority_queue . |
Funciones miembro
Función de miembro | Descripción |
---|---|
empty |
Comprueba si la priority_queue está vacía. |
pop |
Quita el elemento más grande del priority_queue desde la posición superior. |
push |
Agrega un elemento a la cola de prioridad basándose en la prioridad del elemento desde operator< . |
size |
Devuelve el número de elementos de priority_queue . |
top |
Devuelve una referencia constante al elemento más grande en la parte superior del priority_queue . |
Requisitos
Encabezado: <queue>
Espacio de nombres: std
priority_queue::container_type
Un tipo que proporciona el contenedor base que debe adaptarse.
typedef Container container_type;
Comentarios
El tipo es un sinónimo del parámetro de plantilla Container
. La clase de contenedor de secuencias de la biblioteca estándar de C++ (la clase deque
y la vector
predeterminada) cumple los requisitos para usarse como el contenedor base para un objeto priority_queue
. También pueden usarse tipos definidos por el usuario que cumplan los requisitos.
Para obtener más información sobre Container
, vea la sección Comentarios del tema priority_queue
(Clase).
Ejemplo
Vea el ejemplo de priority_queue
para obtener un ejemplo de cómo declarar y usar container_type
.
priority_queue::empty
Comprueba si un priority_queue
está vacío.
bool empty() const;
Valor devuelto
true
si priority_queue
está vacío; false
si priority_queue
no está vacío.
Ejemplo
// pqueue_empty.cpp
// compile with: /EHsc
#include <queue>
#include <iostream>
int main( )
{
using namespace std;
// Declares priority_queues with default deque base container
priority_queue <int> q1, s2;
q1.push( 1 );
if ( q1.empty( ) )
cout << "The priority_queue q1 is empty." << endl;
else
cout << "The priority_queue q1 is not empty." << endl;
if ( s2.empty( ) )
cout << "The priority_queue s2 is empty." << endl;
else
cout << "The priority_queue s2 is not empty." << endl;
}
The priority_queue q1 is not empty.
The priority_queue s2 is empty.
priority_queue::pop
Quita el elemento más grande del priority_queue
desde la posición superior.
void pop();
Comentarios
priority_queue
no debe estar vacía para aplicar la función miembro. La parte superior de priority_queue
está siempre ocupada por el elemento más grande del contenedor.
Ejemplo
// pqueue_pop.cpp
// compile with: /EHsc
#include <queue>
#include <iostream>
int main( )
{
using namespace std;
priority_queue <int> q1, s2;
q1.push( 10 );
q1.push( 20 );
q1.push( 30 );
priority_queue <int>::size_type i, iii;
i = q1.size( );
cout << "The priority_queue length is " << i << "." << endl;
const int& ii = q1.top( );
cout << "The element at the top of the priority_queue is "
<< ii << "." << endl;
q1.pop( );
iii = q1.size( );
cout << "After a pop, the priority_queue length is "
<< iii << "." << endl;
const int& iv = q1.top( );
cout << "After a pop, the element at the top of the "
<< "priority_queue is " << iv << "." << endl;
}
The priority_queue length is 3.
The element at the top of the priority_queue is 30.
After a pop, the priority_queue length is 2.
After a pop, the element at the top of the priority_queue is 20.
priority_queue::priority_queue
Construye un priority_queue
que está vacío o que es una copia de un intervalo de un objeto contenedor base o de otro priority_queue
.
priority_queue();
explicit priority_queue(const Traits& _comp);
priority_queue(const Traits& _comp, const container_type& _Cont);
priority_queue(const priority_queue& right);
template <class InputIterator>
priority_queue(InputIterator first, InputIterator last);
template <class InputIterator>
priority_queue(InputIterator first, InputIterator last, const Traits& _comp);
template <class InputIterator>
priority_queue(InputIterator first, InputIterator last, const Traits& _comp, const container_type& _Cont);
Parámetros
_comp
Función de comparación de tipo constTraits
usada para ordenar los elementos de priority_queue
, que de manera predeterminada es la función de comparación del contenedor base.
_Cont
El contenedor base del que la priority_queue
construida va a ser una copia.
right
El priority_queue
del que el conjunto construido va a ser una copia.
first
Posición del primer elemento en el intervalo de elementos que se va a copiar.
last
Posición del primer elemento más allá del intervalo de elementos que se va a copiar.
Comentarios
Cada uno de los tres primeros constructores especifican un priority_queue
inicial vacío, el segundo también especifica el tipo de función de comparación (comp
) que se usará para establecer el orden de los elementos y el tercero especifica explícitamente el container_type
(_Cont
) que se va a usar. La palabra clave explicit
suprime ciertas clases de conversión automática de tipos.
El cuarto constructor especifica una copia de priority_queue right
.
Los últimos tres constructores copian el intervalo [first, last)
de algún contenedor y usan los valores para inicializar un priority_queue
con mayor claridad a la hora de especificar el tipo de función de comparación de clase Traits
y container_type
.
Ejemplo
// pqueue_ctor.cpp
// compile with: /EHsc
#include <queue>
#include <vector>
#include <deque>
#include <list>
#include <iostream>
int main( )
{
using namespace std;
// The first member function declares priority_queue
// with a default vector base container
priority_queue <int> q1;
cout << "q1 = ( ";
while ( !q1.empty( ) )
{
cout << q1.top( ) << " ";
q1.pop( );
}
cout << ")" << endl;
// Explicitly declares a priority_queue with nondefault
// deque base container
priority_queue <int, deque <int> > q2;
q2.push( 5 );
q2.push( 15 );
q2.push( 10 );
cout << "q2 = ( ";
while ( !q2.empty( ) )
{
cout << q2.top( ) << " ";
q2.pop( );
}
cout << ")" << endl;
// This method of printing out the elements of a priority_queue
// removes the elements from the priority queue, leaving it empty
cout << "After printing, q2 has " << q2.size( ) << " elements." << endl;
// The third member function declares a priority_queue
// with a vector base container and specifies that the comparison
// function greater is to be used for ordering elements
priority_queue <int, vector<int>, greater<int> > q3;
q3.push( 2 );
q3.push( 1 );
q3.push( 3 );
cout << "q3 = ( ";
while ( !q3.empty( ) )
{
cout << q3.top( ) << " ";
q3.pop( );
}
cout << ")" << endl;
// The fourth member function declares a priority_queue and
// initializes it with elements copied from another container:
// first, inserting elements into q1, then copying q1 elements into q4
q1.push( 100 );
q1.push( 200 );
priority_queue <int> q4( q1 );
cout << "q4 = ( ";
while ( !q4.empty( ) )
{
cout << q4.top( ) << " ";
q4.pop( );
}
cout << ")" << endl;
// Creates an auxiliary vector object v5 to be used to initialize q5
vector <int> v5;
vector <int>::iterator v5_Iter;
v5.push_back( 10 );
v5.push_back( 30 );
v5.push_back( 20 );
cout << "v5 = ( " ;
for ( v5_Iter = v5.begin( ) ; v5_Iter != v5.end( ) ; v5_Iter++ )
cout << *v5_Iter << " ";
cout << ")" << endl;
// The fifth member function declares and
// initializes a priority_queue q5 by copying the
// range v5[ first, last) from vector v5
priority_queue <int> q5( v5.begin( ), v5.begin( ) + 2 );
cout << "q5 = ( ";
while ( !q5.empty( ) )
{
cout << q5.top( ) << " ";
q5.pop( );
}
cout << ")" << endl;
// The sixth member function declares a priority_queue q6
// with a comparison function greater and initializes q6
// by copying the range v5[ first, last) from vector v5
priority_queue <int, vector<int>, greater<int> >
q6( v5.begin( ), v5.begin( ) + 2 );
cout << "q6 = ( ";
while ( !q6.empty( ) )
{
cout << q6.top( ) << " ";
q6.pop( );
}
cout << ")" << endl;
}
priority_queue::push
Agrega un elemento a la cola de prioridad basándose en la prioridad del elemento desde operator<
.
void push(const Type& val);
Parámetros
val
El elemento agregado a la parte superior de la priority_queue
.
Comentarios
La parte superior de priority_queue
es la posición ocupada por el elemento más grande del contenedor.
Ejemplo
// pqueue_push.cpp
// compile with: /EHsc
#include <queue>
#include <iostream>
int main( )
{
using namespace std;
priority_queue<int> q1;
q1.push( 10 );
q1.push( 30 );
q1.push( 20 );
priority_queue<int>::size_type i;
i = q1.size( );
cout << "The priority_queue length is " << i << "." << endl;
const int& ii = q1.top( );
cout << "The element at the top of the priority_queue is "
<< ii << "." << endl;
}
The priority_queue length is 3.
The element at the top of the priority_queue is 30.
priority_queue::size
Devuelve el número de elementos de priority_queue
.
size_type size() const;
Valor devuelto
Longitud actual de priority_queue
.
Ejemplo
// pqueue_size.cpp
// compile with: /EHsc
#include <queue>
#include <iostream>
int main( )
{
using namespace std;
priority_queue <int> q1, q2;
priority_queue <int>::size_type i;
q1.push( 1 );
i = q1.size( );
cout << "The priority_queue length is " << i << "." << endl;
q1.push( 2 );
i = q1.size( );
cout << "The priority_queue length is now " << i << "." << endl;
}
The priority_queue length is 1.
The priority_queue length is now 2.
priority_queue::size_type
Tipo entero sin signo que puede representar el número de elementos de un priority_queue
.
typedef typename Container::size_type size_type;
Comentarios
El tipo es un sinónimo de size_type
del contenedor base adaptado por priority_queue
.
Ejemplo
Vea el ejemplo de size
para obtener un ejemplo de cómo declarar y usar size_type
.
priority_queue::top
Devuelve una referencia constante al elemento más grande en la parte superior del priority_queue
.
const_reference top() const;
Valor devuelto
Una referencia al elemento más grande, según lo determinado por la función Traits
, objeto de priority_queue
.
Comentarios
priority_queue
no debe estar vacía para aplicar la función miembro.
Ejemplo
// pqueue_top.cpp
// compile with: /EHsc
#include <queue>
#include <iostream>
int main( )
{
using namespace std;
priority_queue<int> q1;
q1.push( 10 );
q1.push( 30 );
q1.push( 20 );
priority_queue<int>::size_type i;
i = q1.size( );
cout << "The priority_queue length is " << i << "." << endl;
const int& ii = q1.top( );
cout << "The element at the top of the priority_queue is "
<< ii << "." << endl;
}
The priority_queue length is 3.
The element at the top of the priority_queue is 30.
priority_queue::value_type
Tipo que representa el tipo de objeto almacenado como elemento en una priority_queue
.
typedef typename Container::value_type value_type;
Comentarios
El tipo es un sinónimo de value_type
del contenedor base adaptado por priority_queue
.
Ejemplo
// pqueue_value_type.cpp
// compile with: /EHsc
#include <queue>
#include <iostream>
int main( )
{
using namespace std;
// Declares priority_queues with default deque base container
priority_queue<int>::value_type AnInt;
AnInt = 69;
cout << "The value_type is AnInt = " << AnInt << endl;
priority_queue<int> q1;
q1.push( AnInt );
cout << "The element at the top of the priority_queue is "
<< q1.top( ) << "." << endl;
}
The value_type is AnInt = 69
The element at the top of the priority_queue is 69.
Vea también
Seguridad para subprocesos en la biblioteca estándar de C++
Referencia de biblioteca estándar de C++