Recherche…


Boucler à travers un conteneur

En C ++, le bouclage via un conteneur de séquence c peut être effectué en utilisant les index suivants:

for(size_t i = 0; i < c.size(); ++i) c[i] = 0;

Bien que simples, ces écritures sont sujettes à des erreurs sémantiques communes, comme un opérateur de comparaison erroné ou une variable d'indexation incorrecte:

for(size_t i = 0; i <= c.size(); ++j) c[i] = 0;
                     ^~~~~~~~~~~~~~^

Le bouclage peut également être réalisé pour tous les conteneurs utilisant des itérateurs, avec les mêmes inconvénients:

for(iterator it = c.begin(); it != c.end(); ++it) (*it) = 0;

C ++ 11 a introduit des boucles basées sur des plages et auto mots auto clés auto , permettant au code de devenir:

for(auto& x : c) x = 0;

Ici, les seuls paramètres sont le conteneur c et une variable x contenant la valeur actuelle. Cela évite les erreurs de sémantique précédemment signalées.

Selon le standard C ++ 11, l'implémentation sous-jacente est équivalente à:

for(auto begin = c.begin(), end = c.end(); begin != end; ++begin)
{
    // ...
}

Dans une telle implémentation, l'expression auto begin = c.begin(), end = c.end(); les forces begin et end pour être du même type, alors que la end n'est jamais incrémentée, ni déréférencée. La boucle basée sur les plages ne fonctionne donc que pour les conteneurs définis par un itérateur / itérateur de paires. Le standard C ++ 17 assouplit cette contrainte en changeant l'implémentation en:

auto begin = c.begin();
auto end = c.end();
for(; begin != end; ++begin)
{
    // ...
}

Ici, le begin et la end peuvent être de différents types, du moment qu'ils peuvent être comparés pour l'inégalité. Cela permet de parcourir plusieurs conteneurs, par exemple un conteneur défini par un itérateur / sentinelle.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow