El bien establecida "patrón" a tal efecto en los rangos cerrada-abierta la iteración inversa se ve de la siguiente manera
// Iterate over [begin, end) range in reverse
for (iterator = end; iterator-- != begin;) {
// Process `*iterator`
}
o, si lo prefiere,
// Iterate over [begin, end) range in reverse
for (iterator = end; iterator != begin;) {
--iterator;
// Process `*iterator`
}
Este patrón es utilizable, por ejemplo, para una matriz mediante un índice unsigned
int array[N];
...
// Iterate over [0, N) range in reverse
for (unsigned i = N; i-- != 0;) {
array[i]; // <- process it
}
indexación inversa 10
(personas no familiarizadas con este patrón a menudo insisten en utilizar firmaron tipos enteros para la indexación de matrices específicamente porque creen erróneamente que los tipos sin signo impiden la indexación inversa)
Se puede utilizar para iterar sobre una matriz mediante un "deslizamiento puntero" técnica
// Iterate over [array, array + N) range in reverse
for (int *p = array + N; p-- != array;) {
*p; // <- process it
}
o puede ser utilizado para inversa iteración sobre un vector usando un ordinario (no inversa) iterador
for (vector<my_class>::iterator i = my_vector.end(); i-- != my_vector.begin();) {
*i; // <- process it
}
En C++ 11 puede usar el bucle for-basado basado en rango con el adaptador inverso, [consulte aquí] (http://stackoverflow.com/a/8544956/1505939) –
teóricamente, en una máquina de 32 bits, para la segunda solución, si el tamaño del vector es más grande que 2.147.483.647 + 1, se desbordará (vector :: tamaño() no está firmado), pero actualmente es probable que nunca llegue a ese límite (también el límite vectorial actual en máquinas de 32 bits es 1.073.741.823) –