Dobrze ustalony „wzór” dla odwrotnego iteracja zamknięte otwartych przedziałach wygląda następująco
// Iterate over [begin, end) range in reverse
for (iterator = end; iterator-- != begin;) {
// Process `*iterator`
}
albo, jeśli wolisz,
// Iterate over [begin, end) range in reverse
for (iterator = end; iterator != begin;) {
--iterator;
// Process `*iterator`
}
wzór ten jest użyteczny, na przykład, do odwrotnego indeksowania tablicy z nieoznaczoną indeks
int array[N];
...
// Iterate over [0, N) range in reverse
for (unsigned i = N; i-- != 0;) {
array[i]; // <- process it
}
(Osoby znające tego układu często domagać się stosując podpisany typów całkowitych do indeksowania tablicy szczególności ponieważ błędnie sądzić, że bez znaku rodzaje zapobieżenia wstecznego podziału)
może być stosowany dla iteracji przez tablicę używając „ślizgową wskaźnik”technika
// Iterate over [array, array + N) range in reverse
for (int *p = array + N; p-- != array;) {
*p; // <- process it
}
lub mogą być stosowane do odwrotnej iteracji przez vector przy użyciu zwykłych (nie tyłu) iteracyjnej
for (vector<my_class>::iterator i = my_vector.end(); i-- != my_vector.begin();) {
*i; // <- process it
}
W C++ 11 można użyć pętli for z adapterem odwrotnym, [patrz tutaj] (http://stackoverflow.com/a/8544956/1505939) –
Teoretycznie na komputerze 32-bitowym, dla drugie rozwiązanie, jeśli rozmiar wektorowy jest większy niż 2 147 483 647 + 1, to będzie przepełniony (wektor :: size() jest niepodpisany), ale obecnie jest szansa, że nigdy nie osiągniesz tego limitu (również obecny limit wektorowy na maszynach 32-bitowych wynosi 1 073 741 823). –