Почему только 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, который всегда будет работать, но сложность будет зависеть от итератора.