Usa il contenitore di mappe non ordinate STL in C++

Jinku Hu 12 ottobre 2023
  1. Usa l’elemento std::unordered_map per dichiarare un contenitore di mappe non ordinato in C++
  2. Usa la funzione membro contains per verificare se l’elemento dato esiste in una mappa in C++
  3. Usa la funzione membro erase per rimuovere l’elemento specifico da una mappa in C++
  4. Utilizzare la funzione membro insert per aggiungere nuovi elementi a una mappa in C++
Usa il contenitore di mappe non ordinate STL 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;
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Articolo correlato - C++ Map