Простая «аккуратная» альтернатива может основываться на том факте, что итератор списка является объектом пользовательского типа с перегруженными операторами (в отличие от встроенного типа). (Конечно, это формально не гарантировано, но можно ожидать, что это основано на природе контейнера списка.) По этой причине возможно применить перегруженный оператор префикса ++
к временному объекту типа итератора списка.
Чтобы достичь желаемого, вам просто нужно создать временную копию i
, увеличить ее с помощью префикса ++
, а затем использовать результирующее значение для инициализации j
for(std::list<int>::iterator i = l.begin(); i != l.end(); ++i) {
for(std::list<int>::iterator j = ++std::list<int>::iterator(i); j != l.end(); ++j) {
...
}
}
И это все. Обратите внимание, что этот прием довольно популярен и может встречаться в реальном коде время от времени. Также обратите внимание, что он обычно не будет работать с std::vector
, потому что многие реализации используют обычные встроенные указатели в качестве векторных итераторов, но обычно он будет работать с std::list
.
Однако лично я бы не стал использовать это в своем коде. Вы уже получили несколько хороших ответов, которые делают это, добавив дополнительную строку кода.