Maison > Article > développement back-end > Comment l'itération basée sur la plage fonctionne-t-elle avec les cartes standard en C et en quoi la syntaxe diffère-t-elle selon les versions ?
Itération basée sur une plage de cartes standard
En C 11 et au-delà, les boucles for() basées sur une plage offrent une syntaxe pratique pour l'itération à travers des conteneurs. Cependant, leur comportement avec des structures de données complexes comme les cartes peut prêter à confusion.
Considérons l'exemple suivant :
<code class="cpp">std::map<foo, bar> testing = /*...initialized...*/; for (auto abc : testing) { std::cout << abc << std::endl; }
Quel est le type d'abc dans cette boucle ? Cela donnerait-il une clé foo, une valeur de barre ou un itérateur ?
Résolution
En C 11 et C 14, les boucles basées sur une plage parcourent la clé d'une carte -paires de valeurs. Le type de abc est donc std::pair Pour récupérer la clé et la valeur séparément, vous pouvez utiliser le premier et le deuxième membres de la paire : Notez que les variables de la boucle sont généralement déclarées comme const pour signifier qu'elles ne modifieront pas le contenu de la carte. C 17 et Au-delà En C 17, une notation abrégée pratique est introduite pour l'itération des cartes basée sur la plage : Cette syntaxe remplace directement les premier et deuxième membres par la clé et la valeur . Cela permet une expression plus propre et plus concise de l'itération sur les paires clé-valeur. Considérations supplémentaires Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!<code class="cpp">for (auto abc : testing) {
std::cout << abc.first << " has value " << abc.second << std::endl;
}</code>
<code class="cpp">for (const auto& [key, value] : testing) {
std::cout << key << " has value " << value << std::endl;
}</code>
<code class="cpp">for (auto& kv : testing) {
std::cout << kv.first << " had value " << kv.second << std::endl;
kv.second = "modified"; // Modifies the map's value
}</code>