Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
67
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Глава 12. Контейнерные классы

297

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

Метод

Пояснение

iterator beginO, const_iterator beginO const

Указывают на первый элемент

iterator end(), const_iterator end() const

Указывают на элемент, следующий за последним

reversejterator rbeginO, const_reverse_iterator rbeginO const

Указывают на первый элемент в обратной последовательности

reversejterator rendO, const_reverse_iterator rendO const

Указывают на элемент, следующий

за последним, в обратной последовательности

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

Во всех контейнерах определены методы, позволяющие получить сведения о размере контейнеров:

Метод

Пояснение

sizeO

Число элементов

max_size()

Максимальный размер контейнера (порядка миллиарда элементов)

empty0

Булевская функция, показывающая, пуст ли контейнер

Другие ноля и методы контейнеров мы рассмотрим по мере необходимости.

STL определяется в 13 заголовочных файлах:

algorithm deque functional iterator list map

memory numeric queue set stack utility vector

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

Векторы (vector), двусторонние очереди (deque) и списки (list) поддерживают разные наборы операций, среди которых есть совпадающие операции. Они могут быть реализованы с разной эффективностью:

Операция

Метод

vector

deque

list

Вставка в начало

push_front

-

+

+

Удаление из начала

pop_front

-

+

+

Вставка в конец

push_back

+

+

+

298

Часть III. Стандартная библиотека

Операция

Метод

vector

deque

list

Удаление из конца

pop_back

+

+

+

Вставка в произвольное место

insert

(+)

(+)

+

Удаление из произвольного места

erase

(+)

(+)

+

Произвольный доступ к элементу

[ ]. at

+

+

-

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

Как видно из таблицы, такими операциями являются вставка и удаление произвольных элементов очереди и вектора, поскольку при этом все последующие элементы требуется переписывать на новые места.

Итак, вектор — это структура, эффективно реализующая произвольный доступ к элементам, добавление в конец и удаление из конца.

Двусторонняя очередь эффективно реализует произвольный доступ к элементам, добавление в оба конца и удаление из обоих концов.

Список эффективно реализует вставку и удаление элементов в произвольное место, но не имеет произвольного доступа к своим элементам.

Пример работы с вектором. В файле находится произвольное количество целых чисел. Программа считывает их в вектор и выводит на экран в том же порядке.

#include <fstream> #include <vector> using namespace std; int main(){

ifstream in ("inpnum.txt");

vector<int> v; int x; while ( in » x, Mn.eofO)

v.push_back(x);

for (vector<int>::iterator i = v.beginO; i != v.endO; ++i)

cout « *i « " ";

} Поскольку файл содержит целые числа, используется соответствующая специализация шаблона vector - vector<int>. Для создания вектора v используется конструктор по умолчанию. Организуется цикл до конца файла, в котором из него считывается очередное целое число. С помощью метода push_back оно заносится в вектор, размер которого увеличивается автоматически1.

1 Размер вектора не изменяется каждый раз при добавлении элемента, это было бы нерационально. Он увеличивается по определенному алгоритму, которым можно управлять (см. с. 301).