Почему только итератор произвольного доступа реализует оператор + в C++?

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

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

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

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

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

9
задан sth 13 May 2010 в 18:08
поделиться

2 ответа

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

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

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

17
ответ дан 4 December 2019 в 05:59
поделиться

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

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

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

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

37
ответ дан 4 December 2019 в 05:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: