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

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

301

const_reference at(size_type n) const; reference at(size_type n);

reference front 0;

const_reference frontО const; reference backO;

const_reference backO const;

Операция [ ] осуществляет доступ к элементу вектора по индексу без проверки его выхода за границу вектора. Функция at выполняет такую проверку и порождает исключение out_of_range в случае выхода за границу вектора. Естественно, что функция at работает медленнее, чем операция [ ], поэтому в случаях, когда диапазон определен явно, предпочтительнее пользоваться операцией:

for (int i = 0; i<v.size(); i++) cout « v[i] « " ";

В противном случае используется функция at с обработкой исключения:

try{

//...

v.at(i) = v.atC);

}

catch(out_of_range) { ... }

Операции доступа возвращают значение ссылки на элемент (reference) или константной ссылки (const_reference) в зависимости от того, применяются ли они к константному объекту или нет.

Методы front и back возвращают ссылки соответственно на первый и последний элементы вектора (это не то же самое, что begin — указатель на первый элемент и end — указатель на элемент, следующий за последним). Пример:

vector <int> v(5, 10);

v. front О = 100; v.backO = 100;

cout « v[0] « " " « v[v.size() - 1]: // Вывод: 100 100

Функция capacity определяет размер оперативной памяти, занимаемой вектором:

size_type capacityO const;

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

Существует также функция выделения памяти reserve, которая позволяет задать, сколько памяти требуется для хранения вектора:

void reserve(size_type n);

Пример применения функции:

vector <int> v;

v.reserve(lOOO); // Выделение памяти под 1000 элементов

302

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

После выполнения этой функции значение функции capacity будет равно по меньшей мере п. Функцию reserve полезно применять тогда, когда размер вектора известен заранее.

Для изменения размеров вектора служит функция resize:

void resize(size_type sz, T с = ТО);

Эта функция увеличивает или уменьшает размер вектора в зависимости от того, больше задаваемое значение sz, чем значение sizeO, или меньше. Второй параметр задает значение, которое присваивается всем новым элементам вектора. Они помещаются в конец вектора. Если новый размер меньше, чем значение sizeO, из конца вектора удаляется sizeO - sz элементов.

Определены следующие методы для изменения объектов класса vector:

void push__back(const T& value);

void pop_back();

iterator insert(iterator position, const T& value);

void insert(iterator position, size_type n, const T& value);

template <class InputIter>

void insert(iterator position, Inputlter first. Inputlter last); iterator erase(iterator position); iterator eraseO'terator first, iterator last); void swapO; void clearO; // Очистка вектора

Функция pushback добавляет элемент в конец вектора, функция popback — удаляет элемент из конца вектора.

Функция insert служит для вставки элемента в вектор. Первая форма функции вставляет элемент value в позицию, заданную первым параметром (итератором), и возвращает итератор, ссылающийся на вставленный элемент. Вторая форма функции вставляет в вектор п одинаковых элементов. Третья форма функции позволяет вставить несколько элементов, которые могут быть заданы любым диапазоном элементов подходящего типа, например:

vector <int> v(2). vl(3,9);

int m[3] = {3. 4, 5};

v.insert(v.begin(), m, m + 3); // Содержимое v; 3 4 5 0 0

vl.insert(vl.begin() + 1. v.begin().v.begin() + 2);

// Содержимое vl: 9 3 4 9 9

Вставка в вектор занимает время, пропорциональное количеству сдвигаемых на новые позиции элементов. При этом, если новый размер вектора превышает объем занимаемой памяти, происходит перераспределение памяти. Это — плата за легкость доступа по индексу. Если при вставке перераспределения не происходит, все итераторы сохраняют свои значения. В противном случае они становятся недействительными.

Функция erase служит для удаления одного элемента вектора (первая форма функции) или диапазона, заданного с помощью итераторов (вторая форма):

vector <int> v;

for (int i = 1; i<6; i++)v.push_back(i);