Cola de prioridad de C ++ con comparador personalizado

Cola de prioridad de C ++ con comparador personalizado
Las colas prioritarias son de hecho un tipo de datos único. Están respaldados por montones (una forma de un árbol binario), pero se han utilizado de manera similar como colas. Lo que distingue una cola de prioridad de una cola regular sería que mantiene su disposición de clasificación en la duración o (logn) incluso al agregar o eliminar nuevos miembros. Con tipos de datos rudimentarios como números y cadenas, usar una cola de prioridad parece ser la más simple. Las colas prioritarias para tipos personalizados son factibles, al igual que la capacidad de construir un patrón de clasificación personalizado para tipos básicos. Utilizando colas prioritarias, puede usar un comparador personalizado, como ordenar vectores, para describir cómo se pueden clasificar las entradas en la cola de prioridad. En C ++, esto generalmente se termina con solo una estructura. Sin embargo, las declaraciones de Lambda son más rápidas de construir y le permiten acceder a variables más allá del alcance (lo cual es complejo para asegurarse con las estructuras). Entonces, dentro de esta guía, discutiremos el ejemplo de cola prioritaria con el comparador de clientes.

Ejemplo:

Comencemos con el ejemplo de usar una cola de prioridad con el comparador personalizado en c++. Entonces, la carcasa terminal debe abrirse con Ctrl+Alt+T corto. El archivo C ++ debe crearse en el shell utilizando la instrucción "toque" de Ubuntu. Es bastante fácil hacerlo. Después de eso, este archivo debe abrirse dentro de algún editor para hacer código. Puedes tener vim, texto o editor nano. Utilizamos el editor "nano" aquí para una edición y actualización rápida.

$ touch cola.CC
$ nano cola.CC

Por lo tanto, el archivo C ++ vacío se abrirá en la pantalla de su terminal dentro del editor nano. Es hora de agregar algunas bibliotecas de encabezado dentro de su inicio para que nuestro código funcione correctamente. Por lo tanto, utilizamos el signo "#include" con cada encabezado. El encabezado "iOStream" se usa para hacer uso de la secuencia de entrada-salida. El encabezado "vector" está desestimado para usar la estructura de datos vectorial. El encabezado "Unordered_map" se ha utilizado para crear un mapa para los valores de un vector en cantidades. El archivo de encabezado "cola" está aquí para usar la cola de prioridad y sus funciones de datos relacionadas. Comenzamos el método Main () Después del uso del espacio de nombres estándar "STD", hemos comenzado el método Main (). Hemos creado una estructura de datos vectorial llamada "color" del tipo de cadena para mantener los valores de las cadenas. Mientras que el "color" del objeto vectorial ha estado utilizando la función push_back () para agregar algunos nombres de color en el vector, i.mi., Rojo, verde, azul, blanco y negro.

#incluir
#incluir
#incluir
#incluir
usando el espacio de nombres STD;
int main ()

cout << "Starting… \n";
vector color;
color.push_back ("rojo");
color.push_back ("verde");
color.push_back ("azul");
color.push_back ("blanco");
color.push_back ("negro");

Después de crear un objeto vectorial, tenemos que crear una estructura de mapa utilizando la palabra clave "undered_map". El objeto para este mapa es "m", y contiene parámetros de cadena y entero. El mapa se crea para unir la cantidad entera con el vector de cadena, por lo que el valor de tipo entero se asigna a los valores de cadena de un "color" vectorial individualmente.

Desordenable_mapmetro;
m ["rojo"] = 2;
m ["verde"] = 4;
m ["azul"] = 6;
m ["blanco"] = 8;
m ["negro"] = 10;

Aquí viene el comparador personalizado declarado como variable "CMP" con la palabra clave "Auto."La palabra clave automática se usa para recuperar el resultado de cualquier tipo sin definirla. La instrucción "IF" se usa para verificar si la cantidad de un valor de mapa izquierdo es igual a la cantidad de un valor de mapa derecho o no. Si es así, volverá que el carácter del lado izquierdo es mayor que el carácter del lado derecho de una cadena a la variable "CMP". Si no son iguales, devolverá que el valor de la cantidad del lado derecho es mayor que el valor de cantidad del lado izquierdo de una cadena a través de un mapa. Esto está clasificando la cantidad en orden descendente mientras el nombre de la cadena se ordena en orden ascendente.

AUTO CMP = [&] (String & l, String & r)
if (m [le] == m [r])
return l> r;
return m [r]> m [l];
;

Ahora, es hora de crear una cola prioritaria y agregar todos los colores utilizando el vector. Por lo tanto, la cola de prioridad se ha generado utilizando el vector de tipo de cadena, y el tipo de declaración se ha establecido como obtiene de la variable comp. El PQ es el objeto de cola prioritario. El bucle "para" está aquí para empujar cada color a la cola de prioridad "PQ" a través de la función Push ().

prioridad_queue, declType (cmp)> pq (cmp);
for (const string & clr: color)
pq.empuje (clr);

El bucle "while" se continúa ejecutándose hasta que la cola no esté vacía y agrega cada cadena a la cadena "CLR". Ese valor en particular aparecería y se mostraría en el shell. Nuestro código de programa se completa aquí y está listo para ser ejecutado.

mientras(!pq.vacío())
fruta de cadena = PQ.arriba();
pq.estallido();
cout << fruit << " " << m[fruit] << endl;

cout << "Ending… \n";
regresar 0;

La compilación es bastante exitosa. Más que eso, todos los valores de cadena del vector se han mostrado en la carcasa junto con sus cantidades que se mapean a través de "mapa."Puede ver que el orden de la cantidad desciende en nuestro caso.

$ g ++ cola.CC
ps ./a.afuera

Conclusión:

Esto se trataba del simple ejemplo de una cola de prioridad con un comparador personalizado en C++. Lo hemos discutido dentro de un solo ejemplo en detalle manteniendo una forma simple y fácil. Hemos agregado el código en forma de fragmentos que ayuda a los lectores a comprenderlo bien.