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.
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.
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 en utilisant des liaisons structurées:
for (auto& [key, value]: mymap) {
std::cout << key << " => " << value << '\n';
}
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.
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