Почему только random-access-iterator реализует operator+ в C++?

Я хотел бы получить следующее значение для STL list итератор, но он не реализует operator+, есть. Почему и как я могу получить ценность там, где хочу?

Я думаю, что смогу это сделать, если позвоню operator++ несколько раз, но разве это не немного грязно?

то, что я хочу сделать, это следующее:

list<int> l;
...omitted...
list<int>::iterator itr = l.begin() + 3; // but, list iterator does not have
                                         // operator+

что самое лучшее решение для чего я хочу?

2 ответов


вы также можете использовать std::next (и prev) или эквиваленты, предоставляемые Boost, если у вас нет доступа к C++11.

list<int>::iterator itr = std::next(l.begin(), 3);

обоснование: std::advance неудобно использовать (он работает побочным эффектом, а не возвращая копию).


вы хотите использовать std:: advance:

list<int>::iterator itr = l.begin();
std::advance(itr, 3);

advance использовать operator+ и завершить в постоянное время, если итератор является произвольным доступом, в то время как он будет цикл на operator++ и выполнить за линейное время, если итератор не является случайным доступом.  

причина этого заключается в том, чтобы дать вам контроль над требованиями сложности. Если вы заботитесь о сложности вашей операции, вы используете operator+ и получить постоянное время, но это компилируется только с произвольным доступом итераторы. Если вас не волнует сложность, которую вы используете std::advance, который всегда будет работать, но сложность будет зависеть от итератора.