Простейшим способом было бы удерживать два итератора (так как вам все равно придется остановиться на предпоследнем).
std::list<int>::const_iterator second = list.begin(),
end = list.end();
if ( second != end ) // Treat empty list
for(std::list<int>::const_iterator first = second++; // Post-increment
second != end;
++first, ++second)
{
//...
}
Обратите внимание, что first
инициализируется с постинкрементом из second
, поэтому при запуске цикла first
равно list.begin()
, а секунда list.begin()+1
.
Крис Джестер-Янг указывает , что у буста есть функции next
и prior
, хотя я не знаком с этими функциями (из-за моих грехов), их реализация тривиальна (особенно учитывая, что list
имеет двунаправленные итераторы).
template <class Iterator>
Iterator next(Iterator i) // Call by value, original is not changed
{
return ++i;
}
// Implementing prior is left as an exercise to the reader ;o)
Мне кажется, что использование next
не решает эту проблему, а также поддерживает оба итератора, так как вы должны помнить, что next(i)
не равен end()
при каждом использовании.
редактирует:
- Исправлена ошибка, если список пуст, благодаря комментарию Luc Touraille .
- Добавьте ссылку на
next
и почему я думаю, что она не подходит для этого варианта использования.