Inserisci nuovi elementi in una mappa STL in C++

Jinku Hu 12 ottobre 2023
  1. Usa la funzione membro insert per aggiungere un nuovo elemento a std::map in C++
  2. Usa la funzione membro insert_or_assign per aggiungere un nuovo elemento a std::map in C++
  3. Usa la funzione membro emplace per aggiungere un nuovo elemento a std::map in C++
  4. Usa la funzione membro emplace_hint per aggiungere un nuovo elemento a std::map in C++
Inserisci nuovi elementi in una mappa STL in C++

Questo articolo spiegherà più metodi su come aggiungere nuovi elementi nell’oggetto std::map in C++.

Usa la funzione membro insert per aggiungere un nuovo elemento a std::map in C++

Il contenitore STL map fornisce una struttura dati per la memorizzazione di coppie chiave-valore come elementi, ordinati automaticamente al momento dell’inserimento o dell’inizializzazione. Nuovi elementi possono essere aggiunti a un oggetto std::map utilizzando diversi metodi, il più comune dei quali è la funzione insert.

La funzione membro insert ha più overload. Tuttavia, il più semplice prende solo un singolo argomento che specifica il riferimento const all’oggetto inserito. Un altro overload può accettare un riferimento di valore r e usare il comando std::forward per costruire un elemento sul posto, come illustrato nel codice di esempio seguente.

Quest’ultimo overload restituisce una coppia dell’iteratore all’elemento inserito e il valore bool, indicando l’avvenuto inserimento. Dimostriamo anche un overload della funzione insert che prende un elenco di valori-chiave simile all’elenco dell’inizializzatore e costruisce elementi dai valori. Tuttavia, questo overload non ha un tipo restituito.

#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 = {
      {"h", "htop"},
      {"k", "ktop"},
  };

  auto ret = m1.insert({"k", "ktop"});
  ret.second ? cout << "Inserted" : cout << "Not Inserted";
  cout << "\n";

  m1.insert({{"k", "ktop"}, {"p", "ptop"}});
  printMap(m1);

  return EXIT_SUCCESS;
}

Produzione:

Not Inserted h : htop;
k : ktop;
p : ptop;

Usa la funzione membro insert_or_assign per aggiungere un nuovo elemento a std::map in C++

Il nuovo standard C++17 fornisce una funzione membro chiamata insert_or_assign, che inserisce un nuovo elemento in una mappa se la chiave data non esiste già. In caso contrario, la funzione assegnerà il nuovo valore all’elemento con la chiave esistente.

La funzione ha diversi overload, ma quello chiamato nell’esempio seguente accetta due argomenti come riferimenti di valore r a una chiave ea un valore. Questo overload restituisce anche una coppia di iteratori e un valore bool. Si noti che controlliamo lo stato dell’inserimento con un operatore condizionale e stampiamo i messaggi corrispondenti.

#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 = {
      {"h", "htop"},
      {"k", "ktop"},
  };

  auto ret = m1.insert_or_assign("p", "ptop");
  ret.second ? cout << "Inserted" : cout << "Assigned";
  cout << "\n";

  ret = m1.insert_or_assign("t", "ttop");
  ret.second ? cout << "Inserted" : cout << "Assigned";
  cout << "\n";

  printMap(m1);

  return EXIT_SUCCESS;
}

Produzione:

Inserted Inserted h : htop;
k : ktop;
p : ptop;
t : ttop;

Usa la funzione membro emplace per aggiungere un nuovo elemento a std::map in C++

Un’altra funzione membro fornita con il contenitore std::map è emplace. Questa funzione fornisce efficienza in contrasto con la funzione insert in quanto non richiede la copia dei valori degli argomenti. Al contrario, la funzione emplace costruirà l’elemento in-place, il che significa che i parametri dati vengono inoltrati al costruttore della classe. Si noti che, a seconda degli argomenti, verrà chiamato il costruttore corrispondente.

#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 = {
      {"h", "htop"},
      {"k", "ktop"},
  };

  auto ret = m1.emplace("t", "ttop");
  ret.second ? cout << "Inserted" : cout << "Not Inserted";
  cout << endl;

  ret = m1.emplace(std::make_pair("t", "ttop"));
  ret.second ? cout << "Inserted" : cout << "Not Inserted";
  cout << endl;

  printMap(m1);

  return EXIT_SUCCESS;
}

Produzione:

Inserted Not Inserted h : htop;
k : ktop;
t : ttop;

Usa la funzione membro emplace_hint per aggiungere un nuovo elemento a std::map in C++

In alternativa, si può utilizzare la funzione membro emplace_hint per inserire un nuovo elemento in una mappa con un parametro aggiuntivo chiamato hint, che specifica una posizione in cui l’operazione dovrebbe iniziare la ricerca. Restituirebbe un iteratore all’elemento appena inserito se il processo avesse esito positivo. In caso contrario, viene restituito l’iteratore dell’elemento esistente con la stessa chiave.

#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 = {
      {"h", "htop"},
      {"k", "ktop"},
  };

  auto ret = m1.emplace_hint(m1.begin(), "t", "ttop");

  m1.emplace_hint(ret, "m", "mtop");
  m1.emplace_hint(m1.begin(), "p", "ptop");

  printMap(m1);

  return EXIT_SUCCESS;
}

Produzione:

h : htop;
k : ktop;
m : mtop;
p : ptop;
t : ttop;
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