Почему только итератор с произвольным доступом реализует оператор + в C ++? - PullRequest
9 голосов
/ 13 мая 2010

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

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

Я хочу сделать следующее:

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

Какое лучшее решение для того, что я хочу?

Ответы [ 2 ]

37 голосов
/ 13 мая 2010

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

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

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

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

17 голосов
/ 13 мая 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...