Хотя я мог бы использовать оператор -, это уменьшило бы этот последний итератор в каждом цикле.
Нет, не будет. Он получит копию конечного итератора и уменьшит его. Это все. Это не изменит конечный итератор, сохраненный в списке.
Ваша основная проблема должна заключаться в проверке того, что список не пуст, что гарантирует существование --it-> end ().
В c ++ 11 и более поздних версиях лучшим ответом, по-видимому, будет использование std::prev
for(iterator i = lst.begin(); i != std::prev(lst.end()); ++i) {
// do
// stuff
}
Документация для std :: prev на http: //en.cppreference. com / w / cpp / iterator / prev говорит,
Хотя выражение --c.end () часто компилируется, это не гарантируется: c.end () выражение rvalue, и не существует требования итератора, которое указывает, что декремент rvalue гарантированно будет работать. В частности, когда итераторы реализованы в виде указателей, --c.end () не компилируется, а std :: prev (c.end ()) - компилируется.
Я считаю, что std :: prev () в пустом списке не определено, поэтому вам может потребоваться заключить это в условие !i.empty()