Maison > développement back-end > C++ > le corps du texte

Pourquoi les boucles For basées sur une plage se comportent-elles différemment avec « std :: vector » ?

DDD
Libérer: 2024-10-30 04:06:02
original
950 Les gens l'ont consulté

Why Do Range-Based For Loops Behave Differently with `std::vector`?

Range-for-Loops et std::vector

Lors de l'utilisation de boucles for basées sur une plage avec des conteneurs de bibliothèque standard, le Le type de données de l'itérateur dicte souvent le type de données de la variable du compteur. Dans le cas de std::vector, cependant, un comportement unique apparaît en raison de son mécanisme de stockage sous-jacent.

Dans le premier exemple :

<code class="cpp">std::vector<int> intVector(10);
for (auto& i : intVector)
    std::cout << i;
Copier après la connexion

Le std::vector< ;int> contient des entiers, donc le type d'itérateur est un std::vector::iterator. Cet itérateur fait référence à un T&, qui dans ce cas est int&, rendant la variable compteur de type int&.

Maintenant, considérons le deuxième exemple :

<code class="cpp">std::vector<bool> boolVector(10);
for (auto& i : boolVector)
    std::cout << i;</code>
Copier après la connexion

Ici, le std : :vecteur contient des bools, qui sont stockés dans un format entier. Le type d'itérateur est std::vector::iterator, qui déréférence à un std::vector::reference, également connu sous le nom de std::_Bit_reference. Ce type de référence est une rvalue (temporaire) et ne peut pas être lié à une référence non const. Cela entraîne l'erreur de compilation :

<code class="text">invalid initialization of non-const reference of type ‘std::_Bit_reference&amp;’ from an rvalue of type ‘std::_Bit_iterator::reference {aka std::_Bit_reference}’</code>
Copier après la connexion

La solution consiste à utiliser auto&&, qui se liera à une référence lvalue s'il s'agit d'une référence lvalue, ou créera une copie temporaire de la rvalue s'il s'agit d'une référence temporaire :

<code class="cpp">for (auto&& i : boolVector)
    std::cout << i;</code>
Copier après la connexion

Avec cette modification, le code affichera le contenu de boolVector comme prévu.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!