Шаг 102.
Библиотека STL.
Использование нескольких интервалов (окончание)

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

    Чтобы приемный интервал был достаточно большим, необходимо либо создать его с нужным размером, либо изменить размер в программе. Оба варианта подходят только для последовательных контейнеров (векторов, деков и списков). Впрочем, это не создает особых проблем, поскольку ассоциативные контейнеры не могут использоваться в качестве приемника для алгоритмов с перезаписью. Пример увеличения размера контейнера приводится ниже.

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

#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() позволяет инициализировать новые элементы.

    Со следующего шага мы начнем знакомиться с итераторными адаптерами.




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