Шаг 225.
Библиотека STL. Итераторы STL. Итераторные адаптеры. Итераторы вставки. Конечные итераторы вставки

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

    Конечный итератор вставки присоединяет новое значение в конец контейнера вызовом функции push_back(). Функция push_back() определена только в векторах, деках, списках и строках, поэтому конечные итераторы вставки поддерживаются только этими контейнерами стандартной библиотеки C++.

    Конечный итератор вставки должен инициализироваться контейнером в момент создания. Для этого удобнее всего воспользоваться функцией back_inserter(). Ниже приведен пример применения конечного итератора вставки.

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>

#include <conio.h> //необходимо для getch()

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
using namespace std;


std::string ToRus(const std::string &in)
{
  char *buff = new char [in.length()+1];
  CharToOem(in.c_str(),buff);
  std::string out(buff);
  delete [] buff;
  return out;
}

template <class T>
inline void PRINT_ELEMENTS (const T& coll, const char* optcstr="")
{
  typename T::const_iterator pos;
  std::cout << ToRus(optcstr);
  for (pos=coll.begin(); pos!=coll.end(); ++pos) {
    std::cout <<*pos <<' ';
  }
  std::cout << std::endl;
}


int main(int argc, char* argv[])
{
  vector<int> coll;

  // Создание конечного итератора вставки для coll 
  // - неудобный способ 
  back_insert_iterator<vector<int> > iter(coll);

  // Вставка элементов через обычный интерфейс итераторов 
  *iter = 1;
  iter++; 
  *iter = 2;
  iter++;
  *iter = 3;
  PRINT_ELEMENTS(coll,"Вектор: ");

  // Создание конечного итератора вставки и вставка элементов
  // - удобный способ
  back_inserter(coll) = 44;
  back_inserter(coll) = 55;
  PRINT_ELEMENTS(coll,"Вектор после добавления: ");

  // Присоединение всех элементов контейнера с использованием 
  // конечного итератора вставки
  // - резервирование памяти для предотвращения ее перераспределения 
  coll.reserve(2*coll.size()); 
  copy (coll.begin(), coll.end(),  // Источник 
        back_inserter(coll));      // Приемник 
  PRINT_ELEMENTS(coll,"Результат: ");

  getch();
  return 0;
}

//---------------------------------------------------------------------------
Текст этого примера можно взять здесь.

    Результат выполнения программы выглядит так:


Рис.1. Результат работы приложения

    Не забудьте зарезервировать достаточный объем памяти перед вызовом сору(). В противном случае добавление новых элементов конечным итератором вставки может привести к тому, что все остальные итераторы, относящиеся к вектору, станут недействительными. Другими словами, если не зарезервировать достаточно памяти, во время работы алгоритм может испортить переданные ему итераторы источника.

    Строки также поддерживают интерфейс контейнеров STL, включая функцию push_back(). Соответственно конечные итераторы вставки могут использоваться для присоединения символов к строке.

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




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