HOWTO · C++

Comment interpréter une carte en C++

Cet article montre comment boucler les éléments de la structure des données de la carte STL

Cet article explique comment itérer sur une map en C++ en utilisant plusieurs méthodes.

Utilisation de la boucle while pour itérer sur les éléments std::map

Tout d’abord, nous définissons une structure de carte temporaire “tempMap” et la remplissons avec des paires de clés/valeurs arbitraires, que nous produirons à stdout pour mieux démontrer les solutions proposées.

#include <iostream>
#include <map>

using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;

int main() {
  map<int, string> tempMap = {{
                                  1,
                                  "Apple",
                              },
                              {
                                  2,
                                  "Banana",
                              },
                              {
                                  3,
                                  "Mango",
                              },
                              {
                                  4,
                                  "Raspberry",
                              },
                              {
                                  5,
                                  "Blackberry",
                              },
                              {
                                  6,
                                  "Cocoa",
                              }};

  auto iter = tempMap.begin();
  while (iter != tempMap.end()) {
    cout << "[" << iter->first << "," << iter->second << "]\n";
    ++iter;
  }
  cout << endl;
  return 0;
}

Production:

[ 1, Apple ][2, Banana][3, Mango][4, Raspberry][5, Blackberry][6, Cocoa]

Notez que nous utilisons le spécificateur de type auto pour déclarer l’itérateur std::map car cette méthode est recommandée pour la lisibilité. Il s’agit de map<int, string>::iterator, qui peut être spécifié explicitement.

Utilisation de la boucle traditionnelle for pour itérer les éléments std::map

Maintenant, mettons en place la même boucle avec l’itération for traditionnelle, qui est sans doute la plus mauvaise en matière de lisibilité.

#include <iostream>
#include <map>

using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;

int main() {
  map<int, string> tempMap = {{
                                  1,
                                  "Apple",
                              },
                              {
                                  2,
                                  "Banana",
                              },
                              {
                                  3,
                                  "Mango",
                              },
                              {
                                  4,
                                  "Raspberry",
                              },
                              {
                                  5,
                                  "Blackberry",
                              },
                              {
                                  6,
                                  "Cocoa",
                              }};

  for (auto iter = tempMap.begin(); iter != tempMap.end(); ++iter) {
    cout << "[" << iter->first << "," << iter->second << "]\n";
  }
  cout << endl;
  return 0;
}

Utilisation de la boucle for à portée pour itération sur les éléments std::map

Les boucles basées sur la portée sont le choix commun des programmeurs C++ depuis un certain temps. Si votre compilateur supporte la version C++11, alors vous ne devriez plus penser aux boucles traditionnelles encombrantes et apprécier l’élégance de l’exemple suivant:

#include <iostream>
#include <map>

using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;

int main() {
  map<int, string> tempMap = {{
                                  1,
                                  "Apple",
                              },
                              {
                                  2,
                                  "Banana",
                              },
                              {
                                  3,
                                  "Mango",
                              },
                              {
                                  4,
                                  "Raspberry",
                              },
                              {
                                  5,
                                  "Blackberry",
                              },
                              {
                                  6,
                                  "Cocoa",
                              }};

  for (const auto &item : tempMap) {
    cout << "[" << item.first << "," << item.second << "]\n";
  }
  cout << endl;
  return 0;
}

Utilisation de la boucle for basée sur la portée pour itérer les paires clé-valeur std::map

Cette version a été définie depuis la norme C++17 pour offrir une itération plus souple dans les conteneurs associatifs. Le principal avantage de cette méthode par rapport aux exemples précédents est l’accès pratique aux valeurs clés dans la structure map, ce qui assure également une meilleure lisibilité pour un programmeur.

#include <iostream>
#include <map>

using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;

int main() {
  map<int, string> tempMap = {{
                                  1,
                                  "Apple",
                              },
                              {
                                  2,
                                  "Banana",
                              },
                              {
                                  3,
                                  "Mango",
                              },
                              {
                                  4,
                                  "Raspberry",
                              },
                              {
                                  5,
                                  "Blackberry",
                              },
                              {
                                  6,
                                  "Cocoa",
                              }};

  for (const auto& [key, value] : tempMap) {
    cout << "[" << key << "," << value << "]\n";
  }
  cout << endl;
  return 0;
}