Стандартные библиотечные контейнеры имеют как нормальные, так и обратные итераторы, что решает большую часть проблемы.
К сожалению, это разные типы, поэтому вы не можете создать одну переменную, которая может содержать обычный и обратный итераторы.
Итак, я бы обернул ваш цикл в отдельную функцию, и шаблон для работы с обоими:
template <typename It>
void myloop(It first, It last) {
for(It cur = first; cur != last; ++cur)
{
// my loop body
cout << *cur;
}
}
А потом назовите это так:
if( backwards )
myloop(foo.rbegin(), foo.rend());
else
myloop(foo.begin(), foo.end());
Конечно, тогда вы могли бы также использовать один из стандартных библиотечных алгоритмов вместо вашего цикла:
if( backwards )
std::for_each(foo.rbegin(), foo.rend(), [](int item){ cout << item;});
else
std::for_each(foo.begin(), foo.end(), [](int item){ cout << item;});
(Заметьте, я здесь для простоты использую for_each
. Очень вероятно, что std::transform
или std::copy
может быть лучше подходит для описания того, что вы хотите сделать.
Я также использовал лямбда-выражение вместо функции myloop
. Вы можете сделать и то и другое, но лямбда намного короче, а ИМО легче читать.