Le "schéma" bien établi de l'itération inverse dans les plages fermées-ouvertes se présente comme suit
// Iterate over [begin, end) range in reverse
for (iterator = end; iterator-- != begin; ) {
// Process `*iterator`
}
ou, si vous préférez,
// Iterate over [begin, end) range in reverse
for (iterator = end; iterator != begin; ) {
--iterator;
// Process `*iterator`
}
Ce modèle est utile, par exemple, pour l'indexation inverse d'un tableau à l'aide d'un index non signé.
int array[N];
...
// Iterate over [0, N) range in reverse
for (unsigned i = N; i-- != 0; ) {
array[i]; // <- process it
}
(Les personnes qui ne sont pas familières avec ce modèle insistent souvent pour utiliser signé les types entiers pour l'indexation des tableaux, spécifiquement parce qu'ils pensent à tort que les types non signés sont en quelque sorte "inutilisables" pour l'indexation inverse)
Il peut être utilisé pour itérer sur un tableau en utilisant une technique de "pointeur glissant".
// Iterate over [array, array + N) range in reverse
for (int *p = array + N; p-- != array; ) {
*p; // <- process it
}
ou il peut être utilisé pour une itération inverse sur un vecteur en utilisant un itérateur ordinaire (non inverse)
for (vector<my_class>::iterator i = my_vector.end(); i-- != my_vector.begin(); ) {
*i; // <- process it
}
3 votes
En C++11, vous pouvez utiliser un for-loop basé sur l'intervalle avec un adaptateur inverse, voir ici
1 votes
Théoriquement, sur une machine 32 bits, pour la deuxième solution, si la taille du vecteur est supérieure à 2 147 483 647 + 1, il y aura un débordement (vector::size() est non signé), mais actuellement, il y a de fortes chances que vous n'atteigniez jamais cette limite (la limite actuelle des vecteurs sur les machines 32 bits est également de 1 073 741 823).
2 votes
Le problème de débordement de @StefanRogin devient réel lorsqu'au lieu de "int i" dans la boucle for, quelqu'un utilise size_t (ou peut-être auto) dans sa quête pour éviter les avertissements du compilateur (en raison de l'affectation de size() à int). Avec cela, et pour un vecteur à un seul élément, la deuxième itération déborde auto i et la boucle s'exécute avec le "i" débordé, ce qui entraîne toutes sortes de plantages.