Il "modello" consolidato per reverse-iterazione attraverso campi di chiusura-apertura appare come segue
// Iterate over [begin, end) range in reverse
for (iterator = end; iterator-- != begin;) {
// Process `*iterator`
}
o, se si preferisce,
// Iterate over [begin, end) range in reverse
for (iterator = end; iterator != begin;) {
--iterator;
// Process `*iterator`
}
Questo modello è utilizzabile, ad esempio, per la retromarcia-indicizzazione un array utilizzando un indice unsigned
int array[N];
...
// Iterate over [0, N) range in reverse
for (unsigned i = N; i-- != 0;) {
array[i]; // <- process it
}
(persone non hanno familiarità con questo schema spesso insistono sull'uso firmato tipi interi di matrice indicizzazione specificamente perché credono erroneamente che tipi senza segno impediscono indicizzazione inversa)
Può essere utilizzato per l'iterazione di un array usando un "scorrevole pointer" tecnica
// Iterate over [array, array + N) range in reverse
for (int *p = array + N; p-- != array;) {
*p; // <- process it
}
oppure può essere utilizzato per reverse-iterazione su un vettore utilizzando un normale (non inversa) iteratore
for (vector<my_class>::iterator i = my_vector.end(); i-- != my_vector.begin();) {
*i; // <- process it
}
In C++ 11 è possibile utilizzare for-loop basato su intervallo con adattatore di retromarcia, [vedi qui] (http://stackoverflow.com/a/8544956/1505939) –
in teoria, su una macchina a 32 bit, per la seconda soluzione, se la dimensione del vettore è maggiore di 2.147.483.647 + 1, sarà overflow (vector :: size() è senza segno), ma al momento è probabile che non raggiungerai mai quel limite (anche il limite di vettori corrente su macchine a 32 bit è 1.073.741.823). –