Выбрать главу

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

Доступ к вектору с помощью итератора

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

// Доступ к вектору с помощью итератора.

#include <iostream>

#include <vector>

using namespace std;

int main()

{

 vector<char> v; // создание массива нулевой длины

 int i;

 // Помещаем значения в вектор.

 for(i=0; i<10; i++) v.push_back('A' + i);

 /* Получаем доступ к содержимому вектора с помощью индекса. */

 for(i=0; i<10; i++) cout << v[i] << " ";

 cout << endl;

 /* Получаем доступ к содержимому вектора с помощью итератора. */

 vector<char>:: iterator р = v.begin();

 while(p != v.end()) {

  cout << *p << " ";

  p++;

 }

 return 0;

}

Вот как выглядят результаты выполнения этой программы.

A B C D E F G H I J

A B C D E F G H I J

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

Обратите внимание на то, как объявляется итератор р. Тип этого итератора определяется контейнерными классами. Поэтому для получения итератора для конкретного контейнера используйте объявление, аналогичное показанному в этом примере: просто укажите для данного итератора имя контейнера. В нашей программе итератор p инициализируется таким образом, чтобы он указывал на начало вектора (с помощью функции-члена begin()). Итератор, который возвращает эта функция, можно затем использовать для поэлементного доступа к вектору, инкрементируя его соответствующим образом. Этот процесс аналогичен тому, как можно использовать указатель для доступа к элементам массива. Чтобы определить, когда будет достигнут конец вектора, используется функция-член end(). Эта функция возвращает итератор, установленный за последним элементом вектора. Поэтому, если значение р равно v.end(), значит, конец вектора достигнут.

Вставка и удаление элементов из вектора

Помимо занесения новых элементов в конец вектора, у нас есть возможность вставлять элементы в середину вектора, используя функцию insert(). Удалять элементы можно с помощью функции erase(). Использование функций insert() и erase() демонстрируется в следующей программе.

// Демонстрация вставки элементов в вектор и удаления их из него.

#include <iostream>

#include <vector>

using namespace std;