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.
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.
Ce qui suit a fonctionné pour moi:
for (auto x: mymap) {
cout << x.first << endl;
}
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';
}
Je suis curieux de connaître les implications exactes de l'utilisation du mot-clé "auto" ici.
Il permet:
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