Контейнером называют объект одного из классов-контейнеров, входящих в библиотеку STL. Контейнер предназначен для хранения объектов, тип которых может быть как встроенным, так и пользовательским. Контейнеры создаются в свободной памяти при этом распределение памяти и сборка “мусора” выполняется автоматически. Классы-контейнеры подключается к программе с помощью одноименных заголовочных файлов.
Различают последовательные и ассоциативные классы- контейнеры. В данной работе используются только первые.
Среди последовательных - vector(вектор), list(список), deque(двусторонняя очередь) – наиболее распространенным является vector. Отличительной особенностью vector, как и всех контейнеров, является возможность увеличения количества элементов, хранящихся в контейнере, в процессе выполнения программы c помощью методов соответствующего класса. На его основе можно конструировать динамические массивы элементов различных типов, в том числе и определенных пользователем.
Для добавления в конец и удаления последнего элемента контейнера любого из трех рассматриваемых классов предназначены методы push_back() и pop_back(). Kpоме того, список и очередь (но не вектор) поддерживают операции вставки и удаления первого элемента контейнера push_front() и pop_front().
vector<double> vd; //Пустой контейнер
vd.push_back(45.56);
Все типы контейнеров имеют операции вставки и удаления элементов insert и erase. Наличие и эффективность тех или иных операций служат критерием выбора типа последовательного контейнера для конкретной задачи.
Следует заметить, что применение упомянутых операций – дорогое удовольствие в отношении расхода времени и памяти. Поэтому целесообразно ориентировочно оценить размер контейнера (если это возможно), который он получит при выполнении программы, и задать соответствующий начальный размер в конструкторе. Например
vector<int> v(20); // начальный размер контейнера – 20 элементов.
С этими 20 элементами мы можем работать как с обычным статическим массивом, используя гораздо более эффективные операции индексации и присваивания:
v[2]=3;
При этом в программе нужно фиксировать количество элементов, которые необходимо поместить в контейнер, и если их количество превышает 20, переходить к push_back.
Размер контейнера может быть изменен при работе программы функцией resize(N).
vector <char> vc;
vc.resize(34); // Размер контейнера 34
vc[6]=’d’;
Аналогом указателя в контейнерах используется итератор. Он должен быть определен в программе.
vector <int> vv1;
vector<int> ::iterator iv1; //Итератор
Метод begin возвращает значение итератора – указателя на начало контейнера, метод end – на конец.
Библиотека STL обладает т.н. алгоритмами (algorithm) – функциями обработки элементов контейнеров: поиска(find), сортировки(sort) и т.п. При использовании алгоритмов могут использоваться функциональные объекты [1].
Необходимо отметить, что при организации динамического массива, тип элементов кото-рого определяется пользователем, в соответствующем классе должен присутствовать конст-руктор без параметров или вообще не должно быть явно заданных конструкторов.
При использовании контейнеров надо помнить, что за увеличение возможностей, которые они предоставляют программисту, надо платить памятью и увеличением времени выполнения программы.