Mappa dentro C++ Libreria di modelli standard (STL)

โšก Riepilogo intelligente

Mappa dentro C++ รจ un contenitore associativo della Standard Template Library che memorizza gli elementi come coppie chiave-valore ordinate, dove ogni chiave univoca corrisponde a un valore e consente una ricerca, un inserimento e una traversata ordinata rapidi.

  • ๏ธ Contenitore associativo: A C++ La mappa memorizza gli elementi come coppie chiave-valore con chiavi univoche e ordinate automaticamente.
  • ๐Ÿงฉ Intestazione e sintassi: Includi l'intestazione della mappa, quindi dichiara std::map nome per memorizzare le coppie tipizzate.
  • ๏ธ Funzioni integrate: I metodi begin(), size(), empty(), insert(), find(), erase() e clear() gestiscono il contenuto della mappa.
  • ๐Ÿ”„ Iterazione: Un iteratore bidirezionale percorre gli elementi della mappa in ordine alfabetico per consentirne la lettura o la cancellazione.
  • ๐Ÿ”‘ Chiavi univoche: Due elementi non possono condividere una chiave, il che rende una mappa ideale come array associativo.
  • ๐Ÿค– Assistenza AI: GitHub Copilot e assistenti IA simili generano automaticamente dichiarazioni e cicli di mappe a partire da un breve commento.

Mappa dentro C++ STL

In cosa consiste la mappa C++?

In C++Una mappa รจ un contenitore associativo che memorizza elementi in forma mappata. Ogni elemento nella mappa รจ composto da un valore chiave e un valore mappato. Due valori mappati non possono condividere gli stessi valori chiave.

I valori chiave sono utili per ordinare e identificare gli elementi in modo univoco, mentre i valori mappati memorizzano il contenuto associato a ciascuna chiave. I due possono differire nel tipo, ma il tipo membro li combina in una coppia che li contiene entrambi.

Prima di scrivere qualsiasi codice, รจ utile capire perchรฉ una mappa รจ spesso il contenitore piรน adatto.

Perchรฉ usare std::map?

Ecco alcuni motivi per utilizzare una mappa:

  • std::map memorizza solo chiavi univoche, in ordine crescente in base ai criteri di ordinamento scelti.
  • รˆ facile e veloce cercare elementi utilizzando la chiave.
  • Ad ogni chiave รจ collegato un solo elemento.
  • std::map puรฒ essere utilizzato come array associativo.
  • std::map รจ implementabile utilizzando alberi binari bilanciati.

Per sfruttare questi vantaggi, iniziate dalla sintassi di dichiarazione.

Sintassi

Per dichiarare std::map, utilizzare questa sintassi:

std::map<key_datatype, value_datatype>map_name; 
  • Migliori tipo_dati chiave denota il tipo di dati delle chiavi della mappa.
  • Migliori tipo_dati_valore denota il tipo di dati dei valori corrispondenti alle chiavi della mappa.
  • Migliori nome_mappa รจ il nome della mappa.

Per esempio:

map<string, int> my_map; 

Abbiamo dichiarato una mappa chiamata my_map. La mappa avrร  una stringa come tipo di dato chiave e un numero intero come tipo di dato valore.

Tipi di membri

Le funzioni membro possono utilizzare i seguenti tipi di membro come parametri o come tipo di ritorno:

  • tipo_chiave: Chiave (il primo parametro nel modello)
  • tipo_mappato: T (il secondo parametro nel modello)
  • confronto_chiave: Confronta (il terzo parametro nel modello)
  • tipo_allocatore: Alloc (il quarto parametro nel modello)
  • tipo_valore: paio
  • valore_compara: Classe di funzioni nidificate per il confronto di elementi
  • riferimento: allocator_type::riferimento
  • riferimento_const: allocator_type::const_reference
  • pointer: allocator_type::pointer
  • const_pointer: allocator_type::const_pointer
  • iteratore: un iteratore bidirezionale per value_type
  • const_iterator: un iteratore bidirezionale per const value_type
  • reverse_iterator: un iteratore inverso
  • const_reverse_iterator: un iteratore inverso costante
  • tipo_differenza: ptrdiff_t
  • dimensione_tipo: taglia_t

Funzioni integrate di std::map

std::map viene fornito con funzioni integrate. Alcuni di questi includono:

  • begin () โ€“ Questa funzione restituisce l'iteratore al primo elemento della mappa.
  • dimensione() โ€“ Questa funzione restituisce il numero di elementi presenti in una mappa.
  • vuoto() โ€“ Questa funzione restituisce un valore booleano che indica se una mappa รจ vuota.
  • inserisci(coppia(chiave, valore)) โ€“ Questa funzione inserisce una nuova coppia chiave-valore in una mappa.
  • trova(valore) โ€“ Questa funzione restituisce l'iteratore all'elemento val se viene trovato. Altrimenti, restituisce m.end().
  • cancella(posizione dell'iteratore) โ€“ Questa funzione elimina l'elemento nella posizione indicata dall'iteratore.
  • cancella(const g) โ€“ Questa funzione elimina la coppia chiave-valore g da una mappa.
  • chiaro() โ€“ Questa funzione elimina tutti gli elementi da una mappa.

Una volta definite le funzioni, i seguenti esempi le mettono in pratica, a partire dall'iterazione.

Iterazione sugli elementi della mappa

รˆ possibile iterare sugli elementi della mappa. รˆ sufficiente creare un iteratore e utilizzarlo a questo scopo. Ad esempio:

esempio 1

#include <iostream>
#include <string>
#include <map> 

using namespace std;
int main() {

	map<int, string> Students;

	Students.insert(std::pair<int, string>(200, "Alice"));

	Students.insert(std::pair<int, string>(201, "John"));

	cout << "Map size is: " << Students.size() << endl;

	cout << endl << "Default map Order is: " << endl;

	for (map<int, string>::iterator it = Students.begin(); it != Students.end(); ++it) {

		cout << (*it).first << ": " << (*it).second << endl;
	}
}

Produzione:

C++ Esempio di iterazione della mappa 1 output

Ecco uno screenshot del codice:

C++ Esempio di iterazione della mappa 1 codice

Code Spiegazione:

  1. Includi il file di intestazione iostream nel nostro codice per utilizzare le sue funzioni.
  2. Includi il file di intestazione della stringa nel nostro codice per utilizzare le sue funzioni.
  3. Includi il file di intestazione della mappa nel nostro codice per utilizzare le sue funzioni.
  4. Includi lo spazio dei nomi std nel nostro codice per utilizzare le sue classi senza chiamarlo.
  5. Chiama la funzione main(). Il { segna l'inizio del corpo della funzione.
  6. Crea una mappa denominata Studenti in cui le chiavi saranno numeri interi e i valori saranno stringhe.
  7. Inserisci valori nella mappa Studenti. Nella mappa verrร  inserita una chiave pari a 200 e un valore Alice.
  8. Inserisci valori nella mappa Studenti. Nella mappa verrร  inserita una chiave pari a 201 e un valore pari a John.
  9. Utilizza la funzione size() per ottenere la dimensione della mappa denominata Students. Dovrebbe restituire 2.
  10. Stampa del testo sulla console.
  11. Utilizzare un ciclo for per creare un iteratore denominato per scorrere gli elementi della mappa denominati Studenti.
  12. Stampa i valori della mappa Studenti sulla console.
  13. Fine del corpo del ciclo for.
  14. Fine del corpo della funzione main().

Inserimento dei dati in std::map

รˆ possibile inserire elementi in std::map utilizzando la funzione insert(). Ricorda che le chiavi di std::map devono essere univoche.

Quindi, per prima cosa verifica se ogni chiave รจ presente nella mappa. Se รจ presente, la voce non verrร  inserita, ma restituisce l'iteratore per la voce esistente. Se non รจ presente, la voce viene inserita.

La funzione presenta le seguenti varianti:

  • inserire(coppia) โ€“ con questa variante, una coppia chiave-valore viene inserita nella mappa.
  • inserisci(start_itr, end_itr) โ€“ con questa variante, le voci verranno inserite all'interno dell'intervallo definito da start_itr e end_itr da un'altra mappa.

La funzione insert_or_assign() funziona allo stesso modo della funzione insert(), ma se la chiave specificata esiste giร  nella mappa, il suo valore verrร  modificato.

esempio 2

#include <map>
#include <iostream>

using namespace std;

int main() {

	map<int, int> m{ {1,3} , {2,4} , {3,5} };

	m.insert({ 5, 6 });
	m.insert({ 1, 8 });

	m.insert_or_assign(1, 6);  
	
	cout << "Key\tElement\n";
	for (auto itr = m.begin(); itr != m.end(); ++itr) {
		cout << itr->first << '\t' << itr->second << '\n';
	}
	return 0;
}

Produzione:

C++ Esempio di inserimento mappa 2 output

Ecco uno screenshot del codice:

C++ Esempio di codice per l'inserimento di mappe (2 esempi)

Code Spiegazione:

  1. Includi il file di intestazione della mappa nel nostro codice per utilizzare le sue funzioni.
  2. Includi il file di intestazione iostream nel nostro codice per utilizzare le sue funzioni.
  3. Includi lo spazio dei nomi std nel nostro codice per utilizzare le sue classi senza chiamarlo.
  4. Chiama la funzione main(). Il { segna l'inizio del corpo della funzione.
  5. Crea una mappa denominata m dove le chiavi saranno numeri interi e i valori saranno numeri interi. Sono state inserite tre voci nella mappa.
  6. Inserisci una nuova voce nella mappa m. Nella mappa verrร  inserita una chiave pari a 5 e un valore pari a 6.
  7. Tentativo di inserire una chiave giร  esistente. Poichรฉ la chiave 1 esiste giร  nella mappa, l'inserimento non verrร  effettuato.
  8. Utilizzo della funzione insert_or_assign() per inserire o modificare una voce esistente. Poichรฉ la chiave 1 esiste giร , il suo valore verrร  modificato in 6.
  9. Stampa del testo sulla console. Il carattere "\t" crea uno spazio orizzontale mentre il carattere "\n" sposta il cursore del mouse sulla riga successiva.
  10. Utilizzare per loop per creare un iteratore denominato itr per scorrere gli elementi della mappa denominata m.
  11. Stampa i valori della mappa m sulla console. Il carattere "\t" crea uno spazio orizzontale tra ciascuna chiave e il suo valore corrispondente. Al contrario, il carattere โ€œ\nโ€ sposta il cursore del mouse sulla riga successiva dopo ogni iterazione.
  12. Fine del corpo del ciclo for.
  13. Il programma deve restituire un valore in caso di completamento positivo.
  14. Fine del corpo della funzione main().

Ricerca in una mappa

Possiamo usare la funzione find() per cercare elementi in una mappa tramite le loro chiavi. Se la chiave non viene trovata, la funzione restituisce std::map::end. Altrimenti, verrร  restituito un iteratore dell'elemento cercato.

esempio 3

#include <iostream>
#include <string>
#include <map> 
using namespace std;
int main() {
	map<int, string> Students;
	Students.insert(std::pair<int, string>(200, "Alice"));
	Students.insert(std::pair<int, string>(201, "John"));
	std::map<int, string>::iterator it = Students.find(201);
	if (it != Students.end()) {
		std::cout << endl << "Key 201 has the value: => "<< Students.find(201)->second << '\n';
	}
}

Produzione:

C++ mappa trova cerca Esempio 3 output

Ecco uno screenshot del codice:

C++ mappa trova cerca Esempio 3 codice

Code Spiegazione:

  1. Includi il file header iostream nel nostro codice per utilizzare le sue funzioni senza ottenere errori.
  2. Includi il file di intestazione della stringa nel nostro codice per utilizzare le sue funzioni senza ottenere errori.
  3. Includi il file di intestazione della mappa nel nostro codice per utilizzare le sue funzioni senza ottenere errori.
  4. Includi lo spazio dei nomi std nel nostro codice per utilizzare le sue classi senza chiamarlo.
  5. Chiama la funzione main(). La parentesi graffa { indica l'inizio del corpo della funzione main().
  6. Crea una mappa denominata Studenti le cui chiavi saranno numeri interi e stringhe di valori.
  7. Inserisci valori nella mappa Studenti. Nella mappa verrร  inserita una chiave pari a 200 e un valore Alice.
  8. Inserisci valori nella mappa Studenti. Nella mappa verrร  inserita una chiave pari a 201 e un valore pari a John.
  9. Cerca il valore associato alla chiave 201.
  10. Utilizzare un'istruzione if per verificare se viene trovato il valore della chiave.
  11. Stampa il valore della chiave insieme al testo sulla console.
  12. Fine del corpo dell'istruzione if.
  13. Fine del corpo della funzione main().

Eliminazione di dati da una mappa

Possiamo utilizzare la funzione erase() per eliminare un valore da una mappa. รˆ sufficiente creare un iteratore che punti all'elemento da eliminare. L'iteratore viene quindi passato alla funzione erase().

esempio 4

#include <iostream>
#include <string>
#include <map>

using namespace std;
int main() {

	map<std::string, int> my_map;

	my_map.insert(std::make_pair("cow", 1));

	my_map.insert(std::make_pair("cat", 2));

	my_map["lion"] = 3;

	map<std::string, int>::iterator it = my_map.find("cat");

	my_map.erase(it);

	for (map<string, int>::iterator it = my_map.begin(); it != my_map.end(); ++it)

		cout << (*it).first << ": " << (*it).second << endl;

  return 0;
}

Produzione:

C++ mappa cancella elimina Esempio 4 output

Ecco uno screenshot del codice:

C++ mappa cancella elimina Esempio 4 codice

Code Spiegazione:

  1. Includi il file di intestazione iostream nel nostro codice per utilizzare le sue funzioni.
  2. Includi il file di intestazione della stringa nel nostro codice per utilizzare le sue funzioni.
  3. Includi il file di intestazione della mappa nel nostro codice per utilizzare le sue funzioni.
  4. Includi lo spazio dei nomi std nel nostro codice per utilizzare le sue classi senza chiamarlo.
  5. Chiama la funzione main(). La parentesi graffa { indica l'inizio del corpo della funzione main().
  6. Crea una mappa denominata my_map le cui chiavi saranno stringhe e valori interi.
  7. Inserisci i valori nella mappa my_map. Nella mappa verrร  inserita la chiave Mucca e il valore 1.
  8. Inserisci i valori nella mappa my_map. Nella mappa verrร  inserita una chiave Cat e un valore pari a 2.
  9. Aggiungi un valore 3 nella mappa my_map con la chiave di un leone.
  10. Crea un iteratore per scorrere la mappa my_map cercando la chiave cat.
  11. Elimina l'elemento puntato dall'iteratore.
  12. Utilizza un iteratore per scorrere gli elementi della mappa my_map dall'inizio alla fine.
  13. Stampa il contenuto della mappa my_map sulla console.
  14. Il programma deve restituire l'output una volta completato con successo.
  15. Fine del corpo della funzione main().

DOMANDE FREQUENTI

`std::map` mantiene le chiavi ordinate utilizzando un albero di ricerca binario autobilanciante, con O(log n) operazioni. `std::unordered_map` utilizza una tabella hash per ricerche con una complessitร  media di O(1), ma memorizza le chiavi senza un ordine particolare. La scelta dipende dalle esigenze di ordinamento.

Una `std::map` viene tipicamente implementata come un albero di ricerca binario autobilanciante, il piรน delle volte un albero rosso-nero. Questo mantiene le chiavi in โ€‹โ€‹ordine ordinato e garantisce un tempo logaritmico per le operazioni di inserimento, cancellazione e ricerca.

No. Un `std::map` contiene solo chiavi univoche, quindi l'inserimento di una chiave esistente non la sovrascrive. Quando sono necessarie chiavi duplicate, si utilizza `std::multimap`, che consente a piรน elementi di condividere lo stesso valore di chiave.

Utilizza `map_name[key]` per leggere o assegnare un valore; l'operatore di indice inserisce una voce predefinita se la chiave non รจ presente. Il membro `at()` genera un'eccezione per le chiavi mancanti, rendendolo una scelta piรน sicura.

Passa un comparatore personalizzato come terzo argomento del modello, ad esempio std::map >. Il comparatore maggiore ordina le chiavi dalla piรน alta alla piรน bassa invece dell'ordine crescente predefinito.

Un `std::map` memorizza coppie chiave-valore e recupera i valori tramite la chiave, mentre un `std::set` memorizza solo chiavi univoche senza valori associati. Entrambi mantengono gli elementi ordinati, ma una mappa associa i dati a ciascuna chiave.

Sรฌ. Gli assistenti di programmazione basati sull'IA trasformano un breve prompt o un commento in codice std::map funzionante, incluse dichiarazioni, chiamate di inserimento e cicli iteratori. Prima della compilazione, รจ sempre consigliabile rivedere i tipi di chiave generati, l'ordine e i casi limite.

Sรฌ. Le serrature scorrevoli portatili e i catenacci a superficie possono essere usati per mettere in sicurezza una porta a scomparsa dall'esterno. Alcuni kit con catena di sicurezza consentono anche il bloccaggio esterno con chiave o manopola girevole. Copilota GitHub Il sistema suggerisce dichiarazioni di mappe, chiamate di inserimento e ricerca e cicli di iterazione durante la digitazione. Gestisce bene il codice ripetitivo, anche se รจ comunque consigliabile verificare l'unicitร  delle chiavi e la logica prima di compilare.

Riassumi questo post con: