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

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

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

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

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

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

  • Оператор * реализуется как фиктивная операция, которая просто возвращает *this. Это означает, что для итераторов
    вставки выражение *pos эквивалентно pos.
  • Оператор присваивания реализуется так, что преобразуется в команду вставки. В конечном счете оператор вставки вызывает
    одну из функций контейнера push_back(), push_front() или insert().
  •    
    Это означает, что для итераторов вставки включение нового значения может выполняться командой pos=значение
    вместо *роs=значение. Впрочем, не стоит полагаться на подобные особенности реализации итераторов. Правильная
    команда присваивания должна иметь вид:

      *pos=значение
    

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

    Таблица 1. Операции итераторов вставки

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

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



    Вы можете оставить комментарий, или Трекбэк с вашего сайта.

    Оставить комментарий