На этом шаге мы рассмотрим конечные итераторы вставки и их использование.
Конечный итератор вставки присоединяет новое значение в конец контейнера вызовом функции 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(). Соответственно конечные итераторы вставки могут использоваться для присоединения символов к строке.
На следующем шаге мы рассмотрим начальные итераторы вставки.