Itérer à 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 qui utilisait un style différent pour parcourir les clés comme indiqué ci-dessous. Cette fonctionnalité n'a-t-elle été ajoutée que 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 beaucoup d'autres langues Le fournissent déjà.

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

Aussi, je suis curieux de connaître les implications exactes de en utilisant le mot-clé "auto" ici.

23
demandé sur KT100 2013-01-28 09:06:18

5 réponses

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 la plagebasée sur la boucle .

En utilisant juste auto cela peut être écrit comme (Merci Ben)

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

En utilisant juste range pour cela peut être écrit comme

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

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

27
répondu Karthik T 2016-08-02 07:50:48

Ce qui suit a fonctionné pour moi:

for (auto x: mymap) {
  cout << x.first << endl;
}
11
répondu mcsilvio 2013-12-31 16:28:27

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

for (auto& [key, value]: mymap) {
        std::cout << key << " => " << value << '\n';
} 
4
répondu BoshWash 2017-07-23 18:34:35

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

Il active:

  • moins de typage pour un code itératif typique
  • moins de chances d'erreurs manuelles car le compilateur déduit le type exact de l'itérateur.
3
répondu Alok Save 2013-01-28 05:10:23

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ée. C'est ce que dans d'autres langages de programmation s'appellerait une boucle foreach la syntaxe générale est la suivante:

for ( decl : coll ) {
    statement
}

Auto: déduction de Type automatique 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
répondu billz 2013-01-28 05:15:30