Usa il contenitore di mappe non ordinate STL in C++
-
Usa l’elemento
std::unordered_map
per dichiarare un contenitore di mappe non ordinato in C++ -
Usa la funzione membro
contains
per verificare se l’elemento dato esiste in una mappa in C++ -
Usa la funzione membro
erase
per rimuovere l’elemento specifico da una mappa in C++ -
Utilizzare la funzione membro
insert
per aggiungere nuovi elementi a una mappa in C++
Questo articolo spiega diversi metodi su come utilizzare il contenitore STL unordered_map
in C++.
Usa l’elemento std::unordered_map
per dichiarare un contenitore di mappe non ordinato in C++
L’elemento std::unordered_map
implementa un contenitore associativo di coppie chiave-valore in cui ogni chiave è univoca. A differenza di std::map
, il contenitore std::unordered_map
non memorizza gli elementi in ordine. Pertanto, il contenitore viene utilizzato principalmente per la ricerca di elementi e la posizione non ha importanza. Inoltre, non è garantito che la posizione degli elementi durante la durata dell’oggetto sia fissa. Quindi il programmatore dovrebbe considerare l’ordine come indefinito.
L’esempio seguente mostra l’inizializzazione della lista del contenitore unordered_map
e quindi restituisce il contenuto di entrambe le mappe. Si noti che l’ordine decrescente degli elementi m1
non implica che siano ordinati.
#include <iostream>
#include <map>
#include <unordered_map>
using std::cout;
using std::endl;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::unordered_map<int, string> m1 = {
{1, "apple"},
{2, "banana"},
{3, "grape"},
{4, "orange"},
};
std::map<int, string> m2 = {
{1, "apple"},
{2, "banana"},
{3, "grape"},
{4, "orange"},
};
printMap(m1);
printMap(m2);
return EXIT_SUCCESS;
}
Produzione:
4 : orange;
3 : grape;
2 : banana;
1 : apple;
1 : apple;
2 : banana;
3 : grape;
4 : orange;
Usa la funzione membro contains
per verificare se l’elemento dato esiste in una mappa in C++
La funzione membro contains
fa parte del container std::unordered_map
dall’aggiornamento C++20. Puoi usare la funzione per verificare se l’elemento dato esiste nella mappa. Questo comando accetta il valore-chiave come unico argomento e restituisce true
se la chiave viene trovata. La funzione ha il tempo medio di esecuzione costante, con il caso peggiore che è lineare a seconda delle dimensioni del contenitore stesso.
#include <iostream>
#include <map>
#include <unordered_map>
using std::cout;
using std::endl;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::unordered_map<int, string> m1 = {
{1, "apple"},
{2, "banana"},
{3, "grape"},
{4, "orange"},
};
for (int x : {1, 2, 3, 4, 5}) {
if (m1.contains(x)) {
cout << x << ": Found\n";
} else {
cout << x << ": Not found\n";
}
}
return EXIT_SUCCESS;
}
Produzione:
1 : Found 2 : Found 3 : Found 4 : Found 5 : Not found
Usa la funzione membro erase
per rimuovere l’elemento specifico da una mappa in C++
Puoi utilizzare la funzione membro erase
per rimuovere la coppia chiave-valore data dalla mappa. La funzione ha tre overload, il primo dei quali porta l’iteratore all’elemento map, che deve essere rimosso dal contenitore. Il secondo overload della funzione richiede due iteratori per specificare l’intervallo, che verrà rimosso dalla mappa. Tieni presente che l’intervallo specificato deve essere valido all’interno dell’oggetto contenitore chiamante. Il terzo overload può assumere il valore della chiave dell’elemento che deve essere rimosso.
Nell’esempio seguente, rimuoviamo ogni elemento che ha un numero pari come valore chiave.
#include <iostream>
#include <map>
#include <unordered_map>
using std::cout;
using std::endl;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::unordered_map<int, string> m1 = {
{1, "apple"},
{2, "banana"},
{3, "grape"},
{4, "orange"},
};
for (auto it = m1.begin(); it != m1.end();) {
if (it->first % 2 == 0)
it = m1.erase(it);
else
++it;
}
printMap(m1);
return EXIT_SUCCESS;
}
Produzione:
3 : grape;
1 : apple;
Utilizzare la funzione membro insert
per aggiungere nuovi elementi a una mappa in C++
Un’altra funzione membro principale del contenitore unordered_map
è la funzione insert
, che puoi usare per aggiungere nuovi elementi alla mappa. La funzione ha più overload, ma utilizziamo il primo che accetta solo una coppia chiave-valore. Nota che usiamo anche la funzione std::make_pair
per costruire una nuova coppia con i valori degli argomenti dati.
#include <iostream>
#include <map>
#include <unordered_map>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::unordered_map<int, string> m1 = {
{1, "apple"},
{2, "banana"},
{3, "grape"},
{4, "orange"},
};
vector<string> vec{"papaya", "olive", "melon"};
auto count = 0;
for (const auto& item : vec) {
m1.insert(std::make_pair(count, item));
}
printMap(m1);
return EXIT_SUCCESS;
}
Produzione:
0 : papaya;
4 : orange;
3 : grape;
2 : banana;
1 : apple;
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook