Хорошо зарекомендовавший себя «шаблон» для обратной итерации по закрытым открытым диапазонам выглядит следующим образом
// Iterate over [begin, end) range in reverse
for (iterator = end; iterator-- != begin; ) {
// Process `*iterator`
}
или, если хотите,
// Iterate over [begin, end) range in reverse
for (iterator = end; iterator != begin; ) {
--iterator;
// Process `*iterator`
}
Этот шаблон используется, например, для обратного индексирования массива с использованием индекса без знака
int array[N];
...
// Iterate over [0, N) range in reverse
for (unsigned i = N; i-- != 0; ) {
array[i]; // <- process it
}
(Люди, незнакомые с этим шаблоном, часто настаивают на использовании целочисленных типов со знаком для индексации массива именно потому, что они ошибочно полагают, что неподписанные типы предотвращают обратную индексацию)
Может использоваться для перебора массива с использованием метода "скользящего указателя"
// Iterate over [array, array + N) range in reverse
for (int *p = array + N; p-- != array; ) {
*p; // <- process it
}
или его можно использовать для обратной итерации по вектору с использованием обычного (не обратного) итератора
for (vector<my_class>::iterator i = my_vector.end(); i-- != my_vector.begin(); ) {
*i; // <- process it
}