На этом шаге мы рассмотрим особенности использования итераторов вставки.
Итератор вставки представляет собой итераторный адаптер, преобразующий присваивание нового значения во вставку нового значения. С помощью итераторов вставки алгоритмы вставляют новые значения вместо того, чтобы записывать их на место старых. Все итераторы вставки относятся к категории итераторов вывода, то есть поддерживают только вставку новых значений.
Обычно алгоритмы присваивают значения элементам, на которые ссылаются приемные итераторы. Для примера рассмотрим алгоритм сору():
namespace std { template <class InputIterator, class OutputIterator> OutputIterator copy (InputIterator from_pos, // Начало источника Inputlterator from_end, // Конец источника OutputIterator to_pos) // Начало приемника { while (from_pos != from_end) { *to_pos = *from_pos: // Копирование значений ++from_pos; ++to_pos; } return to_pos; } }
Цикл продолжается до тех пор, пока итератор начала источника не дойдет до итератора конца источника. Внутри цикла значение, связанное с итератором from_pos, присваивается значению, связанному с итератором приемника to_pos, после чего оба итератора увеличиваются. В этом цикле особенно интересна команда присваивания нового значения:
*to_pos = значение
Итератор вставки преобразует эту команду присваивания в команду вставки. Но на самом деле в этой команде задействованы две операции: сначала оператор * возвращает элемент, на который ссылается итератор, после чего оператор = присваивает новое значение. В реализации итераторов вставки обычно используется особый "фокус", состоящий из двух этапов.
Это означает, что для итераторов вставки включение нового значения может выполняться командой pos=значение вместо *роs=значение. Впрочем, не стоит полагаться на подобные особенности реализации итераторов. Правильная команда присваивания должна иметь вид:
*pos=значение
Оператор ++ реализуется как фиктивная операция, которая просто возвращает *this. Следовательно, вы не можете изменить позицию итератора вставки. В таблице 1 перечислены все операции итераторов вставки.
Выражение | Описание |
---|---|
*iter | Фиктивная операция (возвращает iter) |
iter1 = value | Вставка value |
++iter | Фиктивная операция (возвращает iter) |
lter++ | Фиктивная операция (возвращает iter) |
На следующем шаге мы рассмотрим разновидности итераторов вставки.