Итератор для второго до последнего элемента в списке

16
задан Karel Petranek 21 June 2011 в 19:35
поделиться

2 ответа

Хотя я мог бы использовать оператор -, это уменьшило бы этот последний итератор в каждом цикле.

Нет, не будет. Он получит копию конечного итератора и уменьшит его. Это все. Это не изменит конечный итератор, сохраненный в списке.

Ваша основная проблема должна заключаться в проверке того, что список не пуст, что гарантирует существование --it-> end ().

4
ответ дан Nicol Bolas 21 June 2011 в 19:35
поделиться

В 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()

4
ответ дан Jay Gowdy 21 June 2011 в 19:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: