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 ?

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 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-30 02:49:28980parcourir

How does range-based iteration work with standard maps in C   and how does the syntax differ across 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. Cela signifie que chaque élément représente une paire clé-valeur plutôt qu'une clé ou une valeur individuelle.

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 :

<code class="cpp">for (auto abc : testing) {
  std::cout << abc.first << " has value " << abc.second << std::endl;
}</code>

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 :

<code class="cpp">for (const auto& [key, value] : testing) {
  std::cout << key << " has value " << value << std::endl;
}</code>

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

  • Il est possible de modifier le contenu de la carte dans la boucle en utilisant des variables de référence déclarées comme auto& :
<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>
  • Si les valeurs de la carte sont grand, il peut être plus efficace d'utiliser une boucle basée sur une plage avec des itérateurs au lieu de paires d'objets. Cependant, cela élimine une partie de la commodité offerte par les boucles for basées sur la plage.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn