Я хотел бы, получают далеко следующее значение для STL list
итератор, но это не реализует operator+
, vector
это имеет все же. Почему и как я могу получить значение, где я хочу?
Я думаю, что могу сделать это, если я звоню operator++
несколько раз, но разве который не немного грязен?
То, что я хочу сделать, следующее:
list<int> l;
...omitted...
list<int>::iterator itr = l.begin() + 3; // but, list iterator does not have
// operator+
Каково лучшее решение для того, что я хочу?
Вы также можете использовать 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
, который всегда будет работать, но сложность будет зависеть от итератора.