Почему итератор пересылки не имеет оператора присваивания?
Я знаю std::forward_list<T>::iterator
не имеет составного оператора присваивания (operator+=
). Но почему это?
Я спрашиваю об этом по трем причинам:
- не будет ли этот оператор продвигать итератор вперед
operator++()
? - Есть ли вспомогательная функция
std::advance()
что делает то же самое? - Я реализую свой собственный список рассылки (для обучения), и я хочу знать, что не так с
operator+=()
,
3 ответа
Использование:
std::advance(it, n);
(Объявлено в <iterator>
.)
Дело в том, что операторы составного присваивания предоставляются только тогда, когда операция имеет стоимость O(1). Поскольку увеличение прямого итератора имеет линейную стоимость, лучше сделать это явным образом.
Если вы хотите новое значение, которое является результатом многократных приращений, используйте:
auto it2 = std::next(it1, n);
Но я не знаю почему?
Впрочем, прямой итератор может продвигаться вперед только на одну единицу за раз. +=
обычно используется, чтобы идти больше чем одна единица за один раз.
не будет ли этот оператор продвигать итератор вперед
operator++()
?
Было бы, но вы могли бы использовать его как iterator += 10
что заставило бы вас поверить, что оно мгновенно продвинется на 10 позиций. Вместо этого должно быть 10 отдельных ++
звонки.
Разве нет вспомогательной функции std::advance(), которая делает то же самое?
Да, но это явно заявляет, что это несколько ++
звонки, если вы не используете случайный итератор.
Я реализую свой собственный список пересылки (для обучения), и я хочу знать, что не так с оператором +=()
Ваш итератор должен соответствовать стандартному определению прямого итератора.
Но я не знаю почему?
Существует определенный контракт, которому должны следовать разные итераторы категории. Описание можно найти здесь. Вы можете увидеть, что такое контракт для категории ForwardIterator, где std::forward_list<T>::iterator
принадлежит, а нет r += n
операция, которая предназначена для RandomAccessIterator