Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции C++.doc
Скачиваний:
6
Добавлен:
01.05.2025
Размер:
1.44 Mб
Скачать

9.7 Класс vector

Класс vector представляет собой реализацию класса динамического массива в виде шаблона, т.е. vector – это динамический массив, способный хранить данные любого типа. Рассмотрим пример, в котором объявляется вектор переменных типа int.

#include <vector>

using namespace std;

void main()

{

vector<int> v;

}

Здесь объявление vector<int> v; создает объект v, имеющий тип “вектор переменных типа int”.

С объектами-векторами можно работать различными способами. Один из вариантов – заполнение вектора некоторыми значениями, добавляя их в конец вектора. Такую операцию выполняет функция-член push_back(). При этом возможно перевыделение памяти внутри вектора.

#include <vector>

#include <iostream.h>

using namespace std;

void main()

{

vector<int> v;

v.push_back(1);

if(v.size() != 0) cout << "Last element: " << v.back() << endl;

v.push_back(2);

if(v.size() != 0) cout << "New last element: " << v.back() << endl;

}

Эта программа выводит:

Last element: 1

New last element: 2

В данном примере объявляется объект v – вектор переменных типа int. Затем в конец вектора помещается значение 1 (на самом деле оно становится первым значением), после чего выводится на экран. Функция-член size() возвращает число элементов вектора и используется здесь для проверки успешности добавления в вектор нового элемента. Функция-член back() возвращает ссылку на последний элемент вектора (в данном случае это все та же 1).

После этого в конец вектора добавляется элемент 2 и ситуация повторяется.

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

#include <vector>

#include <iostream.h>

using namespace std;

void main()

{

vector<int> v;

v.push_back(1);

cout << "Current capacity of v = " << v.capacity() << endl;

v.reserve(20);

cout << "Current capacity of v = " << v.capacity() << endl;

}

Вывод программы следующий:

Current capacity of v = 1

Current capacity of v = 20

Функция-член capacity() возвращает число элементов, под которые память выделена на данный момент емкость вектора. В общем случае емкость превосходит или совпадает с числом элементов, хранящихся в векторе. После вызова v.reserve(20) в примере выше емкость вектора равна 20, хотя хранится в нем по-прежнему один элемент – 1. Кроме всего прочего пример демонстрирует, что функция push_back() приводит к возрастанию емкости на единицу, т.е. перевыделение памяти происходит при каждом вызове этой функции.

При работе с вектором необходимо каким-то образом получать доступ к элементам, хранящимся в векторе. Для этого класс vector определяет оператор индексации [].

#include <vector>

#include <iostream.h>

using namespace std;

int main()

{

vector<int> v;

v.push_back(10);

v.push_back(20);

int i = v[1];

cout << "The second element of v is " << i << endl;

}

Вывод программы:

The second element of v is 20

Оператор [] возвращает ссылку на элемент вектора, поэтому оператор индексации может стоять слева от оператора присваивания. Другими словами, с помощью индексации также можно присваивать значения элементам вектора.

Другие полезные функции-члены класса vector:

  • clear() – очищает вектор, т.е. удаляет все хранящиеся в нем элементы;

  • empty() – возвращает истину, если в векторе нет элементов, т.е. если он пустой;

  • front() – возвращает ссылку на первый элемент вектора;

  • pop_back() – удаляет последний элемент вектора.