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