На этом шаге мы рассмотрим способы изменения размеров контейнеров.
Чтобы приемный интервал был достаточно большим, необходимо либо создать его с нужным размером, либо изменить размер в программе. Оба варианта подходят только для последовательных контейнеров (векторов, деков и списков). Впрочем, это не создает особых проблем, поскольку ассоциативные контейнеры не могут использоваться в качестве приемника для алгоритмов с перезаписью. Пример увеличения размера контейнера приводится ниже.
//--------------------------------------------------------------------------- #include <vcl.h> #include <iostream> #include <list> #include <vector> #include <algorithm> #include <deque> #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; } int main(int argc, char* argv[]) { list<int> coll1; list<int>::iterator pos1; vector<int> coll2; vector<int>::iterator pos2; // Вставка элементов со значениями от 1 до 9 for (int i=1; i<=9; ++i) { coll1.push_back(i); } // Вывод элементов списка cout << ToRus("Элементы списка: "); for (pos1 = coll1.begin(); pos1 != coll1.end(); ++pos1) { cout << *pos1 << ' '; } cout << endl; // Изменение размера приемного интервала, // чтобы он были достаточен для работы алгоритма // с перезаписью. coll2.resize (coll1.size()); // Копирование элементов из первой коллекции во вторую // - перезапись существующих элементов в приемном интервале copy (coll1.begin(),coll1.end(), // Источник coll2.begin()); // Приемник // Вывод элементов вектора cout << ToRus("Элементы вектора: "); for (pos2 = coll2.begin(); pos2 != coll2.end(); ++pos2) { cout << *pos2 << ' '; } cout << endl; // Создание третьей коллекции с необходимым количеством элементов // - исходный размер передается в параметре deque<int> coll3(coll1.size()); deque<int>::iterator pos3; // Копирование элементов из первой коллекции в третью copy (coll1.begin(),coll1.end(), // Источник coll3.begin()); // Приемник // Вывод элементов дека cout << ToRus("Элементы дека: "); for (pos3 = coll3.begin(); pos3 != coll3.end(); ++pos3) { cout << *pos3 << ' '; } cout << endl; getch(); return 0; } //---------------------------------------------------------------------------
Результат работы программы выглядит так:
Рис.1. Результат работы приложения
Размеры существующего контейнера соll2 изменяются функцией resize():
coll2.resize (coll1.size());
Коллекция coll3 инициализируется с явным заданием начального размера, чтобы количество элементов в ней соответствовало количеству элементов в coll1:
deque<int> coll3(coll1.size());
Как при изменении размеров, так и при инициализации с заданным размером создаются новые элементы. Эти элементы инициализируются конструктором по умолчанию, поскольку их создание происходит без передачи аргументов. Передача дополнительного аргумента конструктору и функции resize() позволяет инициализировать новые элементы.
Со следующего шага мы начнем знакомиться с итераторными адаптерами.