Информатика: Методические указания к лабораторным работам № 1-5. Функции. Обработка символьных данных. Организация работы с файлами, страница 8

В настоящее время практически отпала необходимость использовать подобные динамические массивы, поскольку в стандартной библиотеке шаблонов С++ (STL) разработаны такие структуры данных, называемые контейнерами, которые по существу являются динамическими массивами, но с значительно расширенными функциональными возможностями. Речь идет о последовательном контейнере vector. В этом контейнере изменение размера массива при его заполнении происходит автоматически, невидимо для пользователя. Кроме того, vectorвходит в семейство контейнеров STL, поэтому в вашем распоряжении оказывается весь мощный арсенал алгоритмов STL, работающих с этими контейнерами.

Чтобы убедить вас в преимуществе vector перед традиционными динамическими массивами, рассмотрим простой пример.

Пример 1

Создать одномерный динамический массив произвольного размера. Размер массива должен изменяться при его заполнении.

// Традиционный подход

constintM = 5;

inttemp, * Z=new int[M]; //Массив начального размера

for(int i=0;1;i++)

{   cout<<i+1<<"-й элемент ";

cin>>temp;

if(temp==0)

break; //Ограничитель ввода

else(i%M==0) //Массив уже заполнен?

{   int *q=new int[i+M]; // Создаем новый массив и переписываем

      for(int j=0;j<i;j++) // в него элементы массива p

q[j]=Z[j];

      delete[] Z; // Уничтожаем старый массив

      Z=q;        // Z теперь указывает на новый массив

}

  Z[i]=temp;

}

  delete[] Z;// Освобождаем память

}

// Код программы при использовании контейнера vector

#include <vector>

vector<int>v;

 int num;

 for(int i=0;;i++)

{   cout<<i+1<<"-йэлемент ";

      cin>>num;

      if(num==0)

 break;

v.push_back(num);//Добавить numв конец вектора

}

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

Структура стандартной библиотеки шаблонов (STL)

Стандартная библиотека шаблонов (Standard Template Library) – это существенная часть стандартной библиотеки С++. Использование STL дает возможность создавать более надежные, более переносимые и более универсальные программы, а также сократить расходы на их разработку.

Ядро стандартной библиотеки шаблонов включает три основных элемента:

контейнеры,

алгоритмы,

итераторы.

Они работают совместно один с другим, предоставляя тем самым готовые решения различных задач программирования.

Контейнеры – это объекты, которые могут хранить множество элементов – объектов некоторого типа.

Каждый раз, когда в программе возникает необходимость оперировать множеством элементов, в дело вступают контейнеры. В языке C (не в C++) существовал только один встроенный тип контейнера: массив. В STL имеется несколько различных типов контейнеров. Простейшим и самым распространенным контейнером является vector.

Алгоритмы обрабатывают содержимое контейнеров. Их возмож-ности включают средства инициализации, сортировки, поиска и преобразования содержимого контейнеров.

Итераторы – это объекты, которые в той или иной степени действуют подобно указателям. Итераторы обеспечивают интерфейс между контейнерами и алгоритмами. Они позволяют циклически опрашивать содержимое контейнера практически так же, как это делается с помощью указателя при циклическом опросе элементов массива. Итераторы обрабатываются аналогично указателям.

Последовательный контейнер vector

Последовательными называвются контейнеры, в которых каждый элемент занимает определенную позицию.

Вектор – единственный в STL обратносовместимый с чистым C-контейнером. Это означает, что вектор, по сути, дела является обычным динамическим массивом, но с рядом дополнительных функций.

Для доступа к его элементам можно использовать стандартное обозначение индексации массивов. Объектами вектора могут быть как базовые типы переменных (int, float, charи т. д.), так и строки.