web-dev-qa-db-fra.com

Itération à travers une structure de données de carte C ++ STL: Nouvelle technique? (Itération sur la plage et mot-clé "auto")

Jusqu'à présent, j'ai toujours utilisé un itérateur pour parcourir toutes les clés d'une carte STL comme suit:

    for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it){
            std::cout << it->first << "  => " << it->second << '\n';
    }

Très récemment, je suis tombé sur du code utilisant un style différent pour parcourir les touches, comme indiqué ci-dessous. Cette fonctionnalité a-t-elle été ajoutée récemment dans la norme révisée? Cela semble être un moyen plutôt intéressant de faire plus avec moins de code, comme de nombreux autres langages le fournissent déjà.

    for (auto& x: mymap) {
            std::cout << x.first << " => " << x.second << '\n';
    }  

De plus, je suis curieux de connaître les implications exactes de l'utilisation du mot-clé "auto" ici.

27
KT100

Ce code utilise 2 nouvelles fonctionnalités de la dernière norme C++ (C++ 11) le mot clé auto, pour l'inférence de type , et le plage basée sur la boucle .

En utilisant simplement auto cela peut s'écrire (merci Ben)

for (auto it=mymap.begin(); it!=mymap.end(); ++it)

Utiliser juste une plage pour cela peut s'écrire

for (std::pair<const char,int>& x: mymap) {
        std::cout << x.first << " => " << x.second << '\n';
}  

Les deux effectuent exactement la même tâche que vos deux versions.

31
Karthik T

Ce qui suit a fonctionné pour moi:

for (auto x: mymap) {
  cout << x.first << endl;
}
13
mcsilvio

En plus des réponses précédentes, C++ 17 a ajouté une autre approche utilisant des liaisons structurées:

for (auto& [key, value]: mymap) {
        std::cout << key << " => " << value << '\n';
} 
11
BoshWash

Je suis curieux de connaître les implications exactes de l'utilisation du mot-clé "auto" ici.

Il permet:

  • Moins de frappe pour un code d'itération typique
  • Moins de risques d'erreurs manuelles car le compilateur déduit le type exact de l'itérateur.
4
Alok Save

C'est une nouvelle fonctionnalité de C++ 11, elle s'appelle Range-Based for Loops, qui itère sur tous les éléments d'une plage, d'un tableau ou d'une collection donnés. C’est ce que dans d’autres langages de programmation on pourrait appeler une boucle foreach. La syntaxe générale est la suivante:

for ( decl : coll ) {
    statement
}

Auto: Déduction automatique de type avec auto

Avec C++ 11, vous pouvez déclarer une variable ou un objet sans spécifier son type spécifique en utilisant, par exemple:

auto i = 42; // i has type int
double f();
auto d = f(); // d has type double
2
billz