Coda prioritaria C ++ con comparatore personalizzato

Coda prioritaria C ++ con comparatore personalizzato
Le code prioritarie sono davvero un tipo di dati unico. Sono supportati da cumuli (una forma di un albero binario), ma sono stati utilizzati in modo simile come code. Ciò che distingue una coda prioritaria da una coda regolare sarebbe che mantiene la sua disposizione di smistamento nella durata di O (Log) anche quando si aggiunge o elimina nuovi membri. Con tipi di dati rudimentali come numeri e stringhe, l'uso di una coda prioritaria sembra essere la più semplice. Sono fattibili le code prioritarie per i tipi personalizzati, così come la capacità di costruire un modello di ordinamento personalizzato per i tipi di base. Utilizzando le code prioritarie, è possibile utilizzare un comparatore personalizzato, come l'ordinazione dei vettori, per descrivere come è possibile ordinare le voci nella coda di priorità. In C ++, questo è in genere rifinito con solo una struttura. Tuttavia, le dichiarazioni Lambda sono più veloci da costruire e consentono di accedere alle variabili oltre l'ambito (che è complesso per assicurarsi con le strutture). Quindi, all'interno di questa guida, discuteremo dell'esempio della coda prioritaria con il comparatore dei clienti.

Esempio:

Iniziamo con l'esempio dell'utilizzo di una coda prioritaria con il comparatore personalizzato in C++. Quindi il guscio del terminale deve essere aperto con CTRL+ALT+T breve. Il file C ++ deve essere creato nella shell utilizzando l'istruzione "Touch" di Ubuntu. È abbastanza facile farlo. Successivamente, questo file deve essere aperto all'interno di alcuni editor per fare il codice. Puoi avere VIM, testo o nano editor. Utilizziamo l'editor "nano" qui per l'editing rapido e l'aggiornamento.

$ touch coda.cc
$ nano coda.cc

Quindi, il file C ++ vuoto verrà aperto sullo schermo del terminale all'interno dell'editor Nano. È tempo di aggiungere alcune librerie di intestazione al suo inizio per far funzionare correttamente il nostro codice. Pertanto, abbiamo usato il segno "#include" con ogni intestazione. L'intestazione "iostream" viene utilizzata per utilizzare il flusso di input-output. L'intestazione "vettoriale" è lanciata per utilizzare la struttura dei dati vettoriali. L'intestazione "UNORDERD_MAP" è stata utilizzata per creare una mappa per i valori di un vettore in quantità. Il file di intestazione "coda" è qui per utilizzare la coda prioritaria e le sue relative funzioni di dati. Abbiamo iniziato il metodo principale () dopo l'utilizzo dello spazio dei nomi "STD", abbiamo avviato il metodo principale (). Abbiamo creato una struttura di dati vettoriali denominata "colore" del tipo di stringa per contenere i valori della stringa. Mentre l'oggetto vettoriale "colore" ha utilizzato la funzione push_back () per aggiungere alcuni nomi di colore nel vettore, i.e., Rosso, verde, blu, bianco e nero.

#includere
#includere
#includere
#includere
Utilizzo dello spazio dei nomi std;
int main ()

cout << "Starting… \n";
vettore colore;
colore.push_back ("rosso");
colore.push_back ("verde");
colore.push_back ("blu");
colore.push_back ("bianco");
colore.push_back ("nero");

Dopo aver creato un oggetto vettoriale, dobbiamo creare una struttura della mappa utilizzando la parola chiave "non orderd_map". L'oggetto per questa mappa è "M", e contiene parametri di stringa e intero. La mappa viene creata per legare la quantità intera con il vettore della stringa, quindi il valore del tipo intero viene assegnato ai valori della stringa di un "colore" vettoriale individualmente.

UNORDERD_MAPM;
m ["rosso"] = 2;
m ["verde"] = 4;
m ["blu"] = 6;
m ["bianco"] = 8;
m ["nero"] = 10;

Ecco che arriva il comparatore personalizzato dichiarato "CMP" variabile con la parola chiave "auto."La parola chiave automatica viene utilizzata per recuperare il risultato di qualsiasi tipo senza definirla. L'istruzione "if" viene utilizzata per verificare se la quantità di un valore della mappa sinistra è uguale alla quantità di un valore di mappa destro o meno. In tal caso, restituirà che il carattere laterale sinistro è maggiore del carattere lato destro di una stringa alla variabile "CMP". Se non sono uguali, restituirà che il valore della quantità sul lato destro è maggiore del valore della quantità sul lato sinistro di una stringa attraverso una mappa. Questo è ordinare la quantità in ordine decrescente mentre il nome della stringa è ordinato in ordine crescente.

auto cmp = [&] (string & l, string & r)
if (m [le] == m [r])
restituire l> r;
return m [r]> m [l];
;

Ora, è tempo di creare una coda prioritaria e aggiungere tutti i colori che utilizzano il vettore. Quindi, la coda prioritaria è stata generata utilizzando il vettore del tipo di stringa e il tipo di dichiarazione è stato impostato come ottenuto dalla variabile COMP. Il PQ è l'oggetto coda prioritaria. Il ciclo "per" è qui per spingere ogni colore alla coda prioritaria "PQ" tramite la funzione push ().

priorità_queue, decltype (CMP)> PQ (CMP);
for (const string & clr: color)
PQ.push (CLR);

Il ciclo "while" continua ad essere eseguito fino a quando la coda non è vuota e aggiunge ogni stringa da esso alla stringa "CLR". Quel valore particolare verrebbe spuntato ed essere visualizzato sulla shell. Il nostro codice del programma è completato qui e pronto per essere eseguito.

Mentre(!PQ.vuoto())
String Fruit = PQ.superiore();
PQ.pop();
cout << fruit << " " << m[fruit] << endl;

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

La compilation ha abbastanza successo. Inoltre, tutti i valori di stringa del vettore sono stati visualizzati sul guscio insieme alle loro quantità che vengono mappate attraverso "mappa."Puoi vedere che l'ordine della quantità sta discendendo nel nostro caso.

coda $ g ++.cc
$ ./UN.fuori

Conclusione:

Questo riguardava il semplice esempio di coda prioritaria con un comparatore personalizzato in c++. Ne abbiamo discusso in un singolo esempio in dettaglio mantenendo un modo semplice e semplice. Abbiamo aggiunto il codice sotto forma di blocchi che aiutano i lettori a capirlo bene.