Utiliser le conteneur de cartes non ordonnées STL en C++

Jinku Hu 12 octobre 2023
  1. Utilisez l’élément std::unordered_map pour déclarer un conteneur de carte non ordonné en C++
  2. Utilisez la fonction membre contains pour vérifier si l’élément donné existe dans une carte en C++
  3. Utilisez la fonction membre erase pour supprimer l’élément spécifique d’une carte en C++
  4. Utilisez la fonction membre insert pour ajouter de nouveaux éléments à une carte en C++
Utiliser le conteneur de cartes non ordonnées STL en C++

Cet article explique plusieurs méthodes d’utilisation du conteneur STL unordered_map en C++.

Utilisez l’élément std::unordered_map pour déclarer un conteneur de carte non ordonné en C++

L’élément std::unordered_map implémente un conteneur associatif de paires clé-valeur où chaque clé est unique. Contrairement au std::map, le conteneur std::unordered_map ne stocke pas les éléments dans l’ordre trié. Ainsi, le conteneur est principalement utilisé pour la recherche d’éléments et la position n’a pas d’importance. De plus, la position des éléments sur la durée de vie de l’objet n’est pas garantie d’être fixe. Le programmeur doit donc traiter la commande comme non définie.

L’exemple suivant montre l’initialisation de la liste du conteneur unordered_map, puis affiche le contenu des deux cartes. Notez que l’ordre décroissant des éléments m1 n’implique pas qu’ils soient triés.

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

Production:

4 : orange;
3 : grape;
2 : banana;
1 : apple;

1 : apple;
2 : banana;
3 : grape;
4 : orange;

Utilisez la fonction membre contains pour vérifier si l’élément donné existe dans une carte en C++

La fonction membre contains fait partie du conteneur std::unordered_map depuis la mise à jour C++20. Vous pouvez utiliser la fonction pour vérifier si l’élément donné existe dans la carte. Cette commande accepte la clé-valeur comme seul argument et renvoie true si la clé est trouvée. La fonction a un temps d’exécution moyen constant, le pire des cas étant le linéaire en fonction de la taille du conteneur lui-même.

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

Production:

1 : Found 2 : Found 3 : Found 4 : Found 5 : Not found

Utilisez la fonction membre erase pour supprimer l’élément spécifique d’une carte en C++

Vous pouvez utiliser la fonction membre erase pour supprimer la paire clé-valeur donnée de la carte. La fonction a trois surcharges, dont la première amène l’itérateur à l’élément de carte, qui doit être supprimé du conteneur. La deuxième surcharge de fonction prend deux itérateurs pour spécifier la plage, qui sera supprimée de la carte. Sachez que la plage donnée doit être valide dans l’objet conteneur appelant. La troisième surcharge peut prendre la valeur clé de l’élément qui doit être supprimé.

Dans l’exemple suivant, nous supprimons chaque élément qui a un nombre pair comme valeur de clé.

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

Production:

3 : grape;
1 : apple;

Utilisez la fonction membre insert pour ajouter de nouveaux éléments à une carte en C++

Une autre fonction membre de base du conteneur unordered_map est la fonction insert, que vous pouvez utiliser pour ajouter de nouveaux éléments à la carte. La fonction a plusieurs surcharges, mais nous utilisons la première qui ne prend qu’une paire clé-valeur. Notez que nous utilisons également la fonction std::make_pair pour construire une nouvelle paire avec les valeurs d’argument données.

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

Production:

0 : papaya;
4 : orange;
3 : grape;
2 : banana;
1 : apple;
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