C++

Come usare la mappa non ordinata C++++

Come usare la mappa non ordinata C++++
Una mappa, nota anche come array associativo, è un elenco di elementi, in cui ogni elemento è una coppia chiave/valore. Quindi, ogni chiave corrisponde a un valore. Chiavi diverse possono avere lo stesso valore, per lavori ordinari. Ad esempio, le chiavi possono essere un elenco di frutti e i valori corrispondenti, i colori dei frutti. In C++, la mappa è implementata come una struttura dati con funzioni membro e operatori. Una mappa ordinata è quella in cui le coppie di elementi sono state ordinate per chiavi. Una mappa non ordinata è quella in cui non c'è ordine. Questo articolo spiega come usare la mappa non ordinata C++, scritta come unordered_map. È necessaria la conoscenza dei puntatori C++ per comprendere questo articolo. unordered_map fa parte della libreria standard C++.

Classe e oggetti

Una classe è un insieme di variabili e funzioni che lavorano insieme, in cui le variabili non hanno valori assegnati a. Quando i valori sono assegnati alle variabili, la classe diventa un oggetto. Valori diversi dati alla stessa classe danno come risultato oggetti diversi; cioè, oggetti diversi sono la stessa classe con valori diversi. Si dice che creare un oggetto da una classe sia creare un'istanza dell'oggetto.

Il nome, unordered_map, è una classe. Un oggetto creato dalla classe unordered_map ha un nome scelto dal programmatore.

È necessaria una funzione che appartiene a una classe per istanziare un oggetto dalla classe. In C++, quella funzione ha lo stesso nome del nome della classe. Gli oggetti creati (istanziati) dalla classe hanno nomi diversi dati loro, dal programmatore.

Creare un oggetto dalla classe significa costruire l'oggetto; significa anche istanziare.

Un programma C++ che utilizza la classe unordered_map, inizia con le seguenti righe all'inizio del file:

#includere
#includere
usando lo spazio dei nomi std;

La prima riga è per input/output. La seconda riga è quella di consentire al programma di utilizzare tutte le funzionalità della classe unordered_map. La terza riga consente al programma di utilizzare i nomi nello spazio dei nomi standard.

Sovraccarico di una funzione

Quando due o più firme di funzioni diverse hanno lo stesso nome, si dice che quel nome è sovraccarico. Quando viene chiamata una funzione, il numero e il tipo di argomenti determinano quale funzione viene effettivamente eseguita.

Costruzione/Copia Costruzione

Costruzione semplice

Una mappa non ordinata può essere costruita e assegnata ai valori come segue:

unordered_map umap;
umap["banana"] = "giallo";
umap["uva"] = "verde";
umap["fig"] = "viola";

La dichiarazione inizia con la specializzazione del modello con i tipi per le coppie chiave e valore. Questo è seguito dal nome scelto dal programmatore per la mappa; poi un punto e virgola. Il secondo segmento di codice mostra come assegnare valori alle loro chiavi.
Costruzione di Initializer_list
Questo può essere fatto come segue:

unordered_map umap ("banana", "giallo",
"uva", "verde", "fico", "viola");

Costruzione assegnando Initializer_list
Esempio:

unordered_map umap = "banana", "giallo",
"uva", "verde", "fico", "viola";

Costruzione copiando un'altra unordered_map
Esempio:

unordered_map umap1 ("banana", "giallo",
"uva", "verde", "fico", "viola");
unordered_map umap2 (umap1);

Il paio Elemento

Il codice seguente mostra come creare e accedere all'elemento pair:

paio pr = 'd', "mare";
cout << pr.first << '\n';
cout << pr.second << '\n';

L'uscita è:

d
mare

la prima e la seconda sono parole riservate per i due elementi della coppia. I valori nella coppia possono ancora essere modificati utilizzando first e second.

Viene chiamata una coppia, value_type nell'argomento della mappa non ordinata.

unordered_map Accesso agli elementi

mapped_type& operator[](key_type&& k)
Restituisce il valore per la chiave corrispondente. Esempio:

unordered_map umap;
umap["banana"] = "giallo";
umap["uva"] = "verde";
umap["fig"] = "viola";
const char *ret = umap["uva"];
cout << ret <<'\n';

L'uscita è: “verde”. I valori possono essere assegnati allo stesso modo - vedi sopra.

unordered_map Capacità

size_type size() const senza eccezione
Restituisce il numero di coppie nella mappa.

unordered_map umap;
umap["banana"] = "giallo";
umap["uva"] = "verde";
umap["fig"] = "viola";
cout << umap.size() <<'\n';

L'uscita è 3.

bool empty() const noException

Restituisce 1 per vero se la mappa non ha coppie e 0 per falso se ha coppie. Esempio:

unordered_map umap;
cout << umap.empty() <<'\n';

L'uscita è 1.

Iteratori di ritorno e la classe della mappa non ordinata

Un iteratore è come un puntatore ma ha più funzionalità del puntatore.

begin() noeccetto

Restituisce un iteratore che punta alla prima coppia dell'oggetto mappa, come nel seguente segmento di codice:

unordered_map umap;
umap["banana"] = "giallo"; umap["uva"] = "verde"; umap["fig"] = "viola";
unordered_map::iteratore iter = umap.inizio();
paio pr = *iter;
cout << pr.first << ", " << pr.second << '\n';

L'output è: fico, viola. La mappa non è ordinata.

begin() const noeccetto;

Restituisce un iteratore che punta al primo elemento della collezione di oggetti della mappa. Quando la costruzione dell'oggetto è preceduta da const, viene eseguita l'espressione “begin() const” invece di “begin()”. In questa condizione, gli elementi nell'oggetto non possono essere modificati. Viene utilizzato nel codice seguente, ad esempio.

const unordered_map umap ("banana", "giallo",
"uva", "verde", "fico", "viola");
unordered_map::const_iterator iter = umap.inizio();
paio pr = *iter;
cout << pr.first << ", " << pr.second << '\n';

L'output è: fico, viola. La mappa non è ordinata. Nota che questa volta è stato utilizzato const_iterator, invece del solo iteratore, per ricevere l'iteratore restituito.

end() senza eccezione

Restituisce un iteratore che punta immediatamente oltre l'ultimo elemento dell'oggetto mappa.

end() const senza eccezione

Restituisce un iteratore che punta immediatamente oltre l'ultimo elemento dell'oggetto mappa. Quando la costruzione dell'oggetto mappa è preceduta da const, viene eseguita l'espressione “end() const” invece di “end()”.

unordered_map Operazioni

iteratore find(const key_type& k)

Cerca una coppia della chiave data nella mappa. Se viene trovato, restituisce l'iteratore. Se non viene trovato, restituisce un iteratore che punta alla fine della mappa, che non è una coppia. Il codice seguente mostra come utilizzare questa funzione membro:

unordered_map umap;
umap['a'] = 'b'; umap['c'] = 'd'; umap['e'] = 'f';
unordered_map::iteratore iter = umap.trova('c');
se (umap.trova('c') != umap.fine())

paio pr = *iter;
cout << pr.first << ", " << pr.second << '\n';

L'output è: c, d

const_iterator find(const key_type& k) const;

Questa versione della funzione viene chiamata, se la creazione della mappa non ordinata inizia con const, rendendo tutti gli elementi della mappa di sola lettura.

Modificatori unordered_map

paio inserisci (tipo_valore&& oggetto)
Una mappa non ordinata significa che le coppie non sono in alcun ordine. Quindi, il programma inserisce la coppia in qualsiasi posto lo trovi conveniente. La funzione restituisce, coppia. Se l'inserimento è andato a buon fine, bool sarà 1 per vero, altrimenti sarebbe 0 per falso. Se l'inserimento ha esito positivo, l'iteratore punterà all'elemento appena inserito. Il codice seguente ne illustra l'utilizzo:

unordered_map umap;
umap["banana"] = "giallo";
umap["uva"] = "verde";
umap["fig"] = "viola";
umap.insert("ciliegia", "rosso", "fragola", "rosso");
cout << umap.size() << '\n';

L'uscita è: 5. È possibile inserire più di una coppia.

size_type cancella(const key_type& k)

Questa funzione cancella una coppia dalla unordered_map. Il seguente segmento di codice illustra:

unordered_map umap;
umap["banana"] = "giallo";
umap["uva"] = "verde";
umap["fig"] = "viola";
int num = umap.cancella("uva");
cout << umap.size() << '\n';

L'uscita è 2.
void swap(unordered_map&)
È possibile scambiare due mappe non ordinate, come illustrato in questo segmento di codice:

unordered_map umap1 = "banana", "giallo",
"uva", "verde", "fico", "viola", "fragola", "rosso";
unordered_map umap2 = "ciliegia", "rosso", "lime", "verde";
umap1.scambia(umap2);
unordered_map::iteratore iter1 = umap1.inizio();
paio pr1 = *iter1;
unordered_map::iteratore iter2 = umap2.inizio();
paio pr2 = *iter2;
cout << "First key and size of umap1: "<< pr1.first <<", "<< umap1.size() << '\n';
cout << "First key and size of umap2 "<< pr2.first <<", "<< umap2.size() << '\n';
unordered_map umap1 = "banana", "giallo",
"uva", "verde", "fico", "viola", "fragola", "rosso";
unordered_map umap2 = "ciliegia", "rosso", "lime", "verde";
umap1.scambia(umap2);
unordered_map::iteratore iter1 = umap1.inizio();
paio pr1 = *iter1;
unordered_map::iteratore iter2 = umap2.inizio();
paio pr2 = *iter2;
cout << "First key and size of umap1: "<< pr1.first <<", "<< umap1.size() << '\n';
cout << "First key and size of umap2 "<< pr2.first <<", "<< umap2.size() << '\n';

L'uscita è:

Prima chiave e dimensione di umap1: lime, 2

Prima chiave e dimensione di umap2 fragola, 4

La mappa non è ordinata. Nota che la lunghezza di una mappa viene aumentata se necessario. I tipi di dati devono essere gli stessi.

Classe e i suoi oggetti istanziati

Un valore sta a un tipo di dati, come un oggetto istanziato sta a una classe. La costruzione della mappa non ordinata può anche accettare una classe come tipo di dati. Il seguente programma lo illustra:

#includere
#includere
usando lo spazio dei nomi std;
classe TheCla

pubblico:
numero int;
carattere statico;
void func (char cha, const char *str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

divertimento vuoto statico (char ch)

se (ch == 'a')
cout << "Official static member function" << '\n';

;
intero principale()

TheCla obj1; TheCla obj2; TheCla obj3; TheCla obj4; TheCla obj5;
unordered_map umap;
umap = "banana", obj1, "uva", obj2, "fico", obj3, "fragola", obj4, "lime", obj5;
cout << umap.size() << '\n';
restituisce 0;

L'uscita è: 5.

La definizione della classe ha due membri pubblici di dati e due funzioni membro pubbliche. Nella funzione main(), vengono istanziati diversi oggetti per la classe. Viene quindi istanziata una mappa non ordinata, in cui ogni coppia è costituita dal nome di un frutto e da un oggetto della classe. Viene visualizzata la dimensione della mappa. Il programma viene compilato senza avvisi o messaggi di errore.

Applicazione della mappa

L'array associa un indice al valore. Le coppie chiave/valore esistono in molte situazioni della vita, che possono essere programmate. La coppia chiave/valore di frutta/colore è solo un esempio. Un altro esempio è il nome delle persone e la loro età. In questo caso, la coppia sarà di un tipo, coppia. Può anche essere in coppia. In quest'ultimo caso, sarà impiegata la direttiva sul pre-trattamento. Una coppia chiave/valore può ancora essere il nome delle coppie sposate. Nei paesi dove c'è la poligamia, ci saranno mogli diverse per un uomo.

Formazione di una mappa

Una mappa non è un array bidimensionale, con due colonne. Una mappa funziona con una funzione hash. La chiave è codificata dalla funzione hash, in un numero intero di un array. È questo array che contiene i valori. Quindi, in realtà esiste un array con i valori e le chiavi sono mappate sugli indici dell'array, quindi vengono create le corrispondenze tra chiavi e valori. L'hashing è un argomento vasto e non è trattato in questo articolo.

Conclusione

Una mappa, nota anche come array associativo, è un elenco di elementi, in cui ogni elemento è una coppia chiave/valore. Quindi, ogni chiave corrisponde a un valore. In C++, la mappa è implementata come una struttura dati con funzioni membro e operatori. Una mappa ordinata è quella in cui le coppie di elementi sono state ordinate per chiavi. Una mappa non ordinata è quella in cui non c'è ordinamento.

Tecnicamente, un hash è costituito da coppia elementi. In effetti, la coppia è un'intera struttura dati con le sue funzioni e operatori membri. I due parametri del modello per la coppia sono gli stessi due parametri del modello per unordered_map.

L'inizializzatore_list per la mappa è un letterale array di letterali. Ogni letterale interno è costituito da due oggetti, la coppia chiave/valore.

Le funzioni membro e gli operatori per unordered_map possono essere classificati nelle seguenti intestazioni: unordered_map construction/copy building, unordered_map Capacity, unordered_map iterator, unordered_map Operations e unordered_map Modifiers.

Una mappa non ordinata viene utilizzata quando una chiave deve essere mappata su un valore.

cris

Battaglia per Wesnoth 1.13.6 Sviluppo rilasciato
Battaglia per Wesnoth 1.13.6 rilasciato il mese scorso, è la sesta versione di sviluppo nella 1.13.x e offre una serie di miglioramenti, in particolar...
Come installare League Of Legends su Ubuntu 14.04
Se sei un fan di League of Legends, questa è un'opportunità per testare League of Legends. Nota che LOL è supportato su PlayOnLinux se sei un utente L...
Installa l'ultimo gioco di strategia OpenRA su Ubuntu Linux
OpenRA è un motore di gioco di strategia in tempo reale gratuito/libero che ricrea i primi giochi di Westwood come il classico Command & Conquer: Red ...