Usa un contenitore di mappe STL in C++

Jinku Hu 12 ottobre 2023
  1. Usa std::map per dichiarare un oggetto contenitore mappa in C++
  2. Usa la funzione membro find per cercare un elemento specifico in una mappa in C++
  3. Utilizzare la funzione membro insert per memorizzare un elemento in una mappa in C++
  4. Usa la funzione membro merge per unire elementi di due oggetti mappa in C++
Usa un contenitore di mappe STL in C++

Questa guida ti mostrerà diversi metodi su come utilizzare il contenitore di mappe STL in C++.

Usa std::map per dichiarare un oggetto contenitore mappa in C++

Il contenitore std::map implementa una struttura dati di coppia chiave-valore ordinata, in cui le chiavi sono univoche. I valori chiave ordinano gli elementi della coppia in ordine crescente per impostazione predefinita; tuttavia, l’utente può opzionalmente passare una funzione di confronto al modello std::map. È possibile inizializzare l’oggetto map con un elenco di valori in cui ogni elemento è specificato tra parentesi graffe separate. In questo caso, creiamo una mappa di coppie stringhe e poi ne stampiamo elementi nel flusso cout. Nota che ogni elemento è accessibile come membri std::pair nel cicli for.

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
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::map<string, string> m1 = {
      {"11900K", "Core i9"},
      {"11700K", "Core i7"},
      {"11600K", "Core i5"},
      {"1390P", "Xeon W"},
  };

  printMap(m1);

  return EXIT_SUCCESS;
}

Produzione:

11600K : Core i5;
11700K : Core i7;
11900K : Core i9;
1390P : Xeon W;

Usa la funzione membro find per cercare un elemento specifico in una mappa in C++

La funzione membro find è utile per cercare una coppia chiave-valore specifica nel contenitore map. L’operazione di ricerca ha complessità logaritmica. La funzione find prende il riferimento a una chiave e restituisce l’iteratore all’elemento con la chiave equivalente. Quando non viene trovato alcun elemento con la chiave specificata, viene restituito un iteratore passato alla fine.

Il seguente frammento di codice mostra come inizializzare un nuovo contenitore map con gli iteratori di intervallo. Si noti che il primo iteratore viene recuperato utilizzando la funzione find. Inoltre, può essere utile controllare la validità dell’iteratore restituito.

#include <cassert>
#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
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::map<string, string> m1 = {
      {"11900K", "Core i9"},
      {"11700K", "Core i7"},
      {"11600K", "Core i5"},
      {"1390P", "Xeon W"},
  };

  std::map<string, string> m2(m1.find("11700K"), m1.end());
  printMap(m2);

  auto ret = m1.find("11700K");
  assert(ret != m1.end());
  std::map<string, string> m3(ret, m1.end());
  printMap(m3);

  return EXIT_SUCCESS;
}

Produzione:

11700K : Core i7;
11900K : Core i9;
1390P : Xeon W;

Utilizzare la funzione membro insert per memorizzare un elemento in una mappa in C++

È possibile aggiungere nuovi elementi al contenitore map esistente utilizzando la funzione membro insert. Il membro insert prende il riferimento all’oggetto da aggiungere e restituisce un container std::pair costituito da un iteratore dell’elemento inserito e da un valore bool che indica lo stato di inserimento riuscito. Quando l’inserimento fallisce, l’iteratore punta all’elemento che ha impedito l’operazione.

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
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::map<string, string> m1 = {
      {"11900K", "Core i9"},
      {"11700K", "Core i7"},
      {"11600K", "Core i5"},
      {"1390P", "Xeon W"},
  };

  auto ret1 = m1.insert({"1390P", "Xeon W"});
  if (!ret1.second) {
    cout << "Not inserted!" << endl;
  }

  ret1 = m1.insert({"1390", "Xeon W"});
  if (!ret1.second) {
    cout << "Not inserted!" << endl;
  }
  printMap(m1);

  return EXIT_SUCCESS;
}

Produzione:

Not inserted !11600K : Core i5;
11700K : Core i7;
11900K : Core i9;
1390 : Xeon W;
1390P : Xeon W;

Usa la funzione membro merge per unire elementi di due oggetti mappa in C++

La funzione membro merge può essere utilizzata per unire gli elementi da due contenitori di mappe. Viene chiamato dall’oggetto map che ha bisogno di memorizzare gli elementi combinati e prende un’altra map come argomento. Dopo l’operazione, tutti i puntatori ei riferimenti agli elementi trasferiti sono validi.

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
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::map<string, string> m1 = {
      {"11900K", "Core i9"},
      {"11700K", "Core i7"},
      {"11600K", "Core i5"},
      {"1390P", "Xeon W"},
  };

  std::map<string, string> m4 = {
      {"11900KF", "Core i9"}, {"11600T", "Core i5"}, {"11700K", "Core i7"}};

  m1.merge(m4);
  printMap(m1);

  return EXIT_SUCCESS;
}

Produzione:

11600K : Core i5;
11600T : Core i5;
11700K : Core i7;
11900K : Core i9;
11900KF : Core i9;
1390P : Xeon W;
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