Необходимая рекомендация использовать стандартную библиотеку:
std::for_each(lst.begin(), --lst.end(), process);
Если вы не хотите хлопот с созданием функтора [я почти никогда не делаю], и вы не можете использовать обратные итераторы, поднимитеконечная проверка из цикла:
for(iterator i = lst.begin(), j = --lst.end(); i != j; ++i) {
// do
// stuff
}
Или вы можете просто доверить оптимизатору признать, что ему не нужно повторно создавать конечное условие, и выполнить сам подъем.Насколько это надежно, зависит от реализации списка, от того, насколько сложен ваш код цикла и насколько хорош ваш оптимизатор.
В любом случае, просто делайте то, что вам легче понять, и беспокойтесь о производительности после того, как вы закончите.