Шаг 223.
Библиотека STL. Итераторы STL. Итераторные адаптеры. Итераторы вставки. Функциональность итераторов вставки

    На этом шаге мы рассмотрим особенности использования итераторов вставки.

    Итератор вставки представляет собой итераторный адаптер, преобразующий присваивание нового значения во вставку нового значения. С помощью итераторов вставки алгоритмы вставляют новые значения вместо того, чтобы записывать их на место старых. Все итераторы вставки относятся к категории итераторов вывода, то есть поддерживают только вставку новых значений.

Функциональность итераторов вставки

    Обычно алгоритмы присваивают значения элементам, на которые ссылаются приемные итераторы. Для примера рассмотрим алгоритм сору():

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 = значение

    Итератор вставки преобразует эту команду присваивания в команду вставки. Но на самом деле в этой команде задействованы две операции: сначала оператор * возвращает элемент, на который ссылается итератор, после чего оператор = присваивает новое значение. В реализации итераторов вставки обычно используется особый "фокус", состоящий из двух этапов.

  1. Оператор * реализуется как фиктивная операция, которая просто возвращает *this. Это означает, что для итераторов вставки выражение *pos эквивалентно pos.
  2. Оператор присваивания реализуется так, что преобразуется в команду вставки. В конечном счете оператор вставки вызывает одну из функций контейнера push_back(), push_front() или insert().

    Это означает, что для итераторов вставки включение нового значения может выполняться командой pos=значение вместо *роs=значение. Впрочем, не стоит полагаться на подобные особенности реализации итераторов. Правильная команда присваивания должна иметь вид:

  *pos=значение

    Оператор ++ реализуется как фиктивная операция, которая просто возвращает *this. Следовательно, вы не можете изменить позицию итератора вставки. В таблице 1 перечислены все операции итераторов вставки.

Таблица 1. Операции итераторов вставки
Выражение Описание
*iter Фиктивная операция (возвращает iter)
iter1 = value Вставка value
++iter Фиктивная операция (возвращает iter)
lter++ Фиктивная операция (возвращает iter)

    На следующем шаге мы рассмотрим разновидности итераторов вставки.




Предыдущий шаг Содержание Следующий шаг