Вы хотите использовать std :: advance :
list<int>::iterator itr = l.begin();
std::advance(itr, 3);
advance
будет использовать operator+
и завершаться в постоянное время, если итератор имеет произвольный доступ, в то время как он будет циклически работать на operator++
и завершаться за линейное время, если итератор не является произвольным доступом.
Причина этого в том, чтобы дать вам контроль над требованиями сложности. Если вас волнует сложность вашей операции, вы используете operator+
и получаете постоянное время, но это компилируется только с итераторами с произвольным доступом. Если вас не волнует сложность, вы используете std::advance
, которая всегда будет работать, но сложность будет зависеть от итератора.