Insérer de nouveaux éléments dans une carte STL en C++

Jinku Hu 12 octobre 2023
  1. Utilisez la fonction membre insert pour ajouter un nouvel élément à std::map en C++
  2. Utilisez la fonction membre insert_or_assign pour ajouter un nouvel élément à std::map en C++
  3. Utilisez la fonction membre emplace pour ajouter un nouvel élément à std::map en C++
  4. Utilisez la fonction membre emplace_hint pour ajouter un nouvel élément à std::map en C++
Insérer de nouveaux éléments dans une carte STL en C++

Cet article expliquera plusieurs méthodes pour ajouter de nouveaux éléments dans l’objet std::map en C++.

Utilisez la fonction membre insert pour ajouter un nouvel élément à std::map en C++

Le conteneur STL map fournit une structure de données pour stocker des paires clé-valeur sous forme d’éléments, triés automatiquement lors de l’insertion ou de l’initialisation. De nouveaux éléments peuvent être ajoutés à un objet std::map en utilisant plusieurs méthodes, dont la plus courante est la fonction insert.

La fonction membre insert a plusieurs surcharges. Pourtant, le plus simple ne prend qu’un seul argument spécifiant la référence const à l’objet inséré. Une autre surcharge peut accepter une référence de valeur r et utiliser la commande std::forward pour construire un élément sur place, comme illustré dans l’exemple de code suivant.

Cette dernière surcharge renvoie une paire de l’itérateur à l’élément inséré et la valeur bool, indiquant une insertion réussie. Nous démontrons également une surcharge de la fonction insert qui prend une liste de valeurs-clés similaire à la liste d’initialisation et construit des éléments à partir des valeurs. Cependant, cette surcharge n’a pas de type de retour.

#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;
}

Production:

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

Utilisez la fonction membre insert_or_assign pour ajouter un nouvel élément à std::map en C++

La nouvelle norme C++17 fournit une fonction membre appelée insert_or_assign, qui insère un nouvel élément dans une carte si la clé donnée n’existe pas déjà. Sinon, la fonction affectera la nouvelle valeur à l’élément avec la clé existante.

La fonction a plusieurs surcharges, mais celle appelée dans l’exemple suivant prend deux arguments comme références de valeur r à une clé et à une valeur. Cette surcharge renvoie également une paire d’itérateur et une valeur bool. Notez que nous vérifions l’état de l’insertion avec un opérateur conditionnel et imprimons les messages correspondants.

#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;
}

Production:

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

Utilisez la fonction membre emplace pour ajouter un nouvel élément à std::map en C++

Une autre fonction membre fournie avec le conteneur std::map est emplace. Cette fonction offre une efficacité contrairement à la fonction insert car elle ne nécessite pas de copier les valeurs des arguments. Au contraire, la fonction emplace construira l’élément en place, ce qui signifie que les paramètres donnés sont transmis au constructeur de la classe. Notez qu’en fonction des arguments, le constructeur correspondant sera appelé.

#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;
}

Production:

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

Utilisez la fonction membre emplace_hint pour ajouter un nouvel élément à std::map en C++

Alternativement, on peut utiliser la fonction membre emplace_hint pour insérer un nouvel élément dans une carte avec un paramètre supplémentaire appelé hint, qui spécifie une position où l’opération doit commencer la recherche. Il renverrait un itérateur à l’élément nouvellement inséré si le processus réussissait. Sinon, l’itérateur de l’élément existant avec la même clé est renvoyé.

#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;
}

Production:

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

Article connexe - C++ Map