Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
STL5 / lab1-vector / lab1-vector.doc
Скачиваний:
12
Добавлен:
10.04.2015
Размер:
183.3 Кб
Скачать

Класс vector

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

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

Определение класса vector

Класс vector – это шаблон, определенный в пространстве именstdи представленный в заголовочном файле<vector>. Определение имеет следующий вид:

template <class T, class A = allocator<T>> class std :: vector {………};

Шаблон имеет два параметра:

Тип Т – определяет тип элементов, которые содержит вектор

Тип А – определяет тип распределителя памяти, который используется для выделение памяти под элементы вектора. Данный параметр имеет значение по умолчанию, которое может быть использовано в большинстве случаев.

Таким образом, вектор может быть объявлен следующем образом:

#include <vector>

using namespace std;

vector<int> VectorOfInt; // вектор целых чисел

vector<double> VectorOfDouble; // вектор целых чисел

typedef struct

{

int x;

int y;

} Point;

vector<Point> VectoeOfPoints; // вектор структур содержащий информацию

// о точках

vector<double*> VectorOfDoublePtrs; // вектор указателей на вещественные

// числа

Экспортируемые типы

Класс vector– полный стандартного контейнера2. Каждый стандартный контейнер определяет несколько имен типов в качестве членов класса

template <class T, class A = allocator<T>>

class std::vector

{

public:

typedef T value_type;

typedef A allocator_type;

typedef typename A::sizetype size_type;

typedef typename A::difference_type difference_type;

typedef implementation_dependent1 iterator;

typedef implementation_dependent2 const_iterator;

typedef std::reverse_iterator<iterator> reverse_iterator;

typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

typedef typename A::pointer pointer;

typedef typename A::const_pointer const_pointer;

typedef typename A::reference reference;

typedef typename A::const_reference const_reference;

};

  • value_type– тип элементов в контейнере, является синонимом типа заданного первым аргументом шаблона. Так дляvector<int> типvector<int>::value_typeявляется синонимом типаint.

  • size_type- описывает тип, используемый в контейнере для индексации. Так объявить переменную содержащую индекс элемента вектора можно следующим образом.

vector<int>:: size_type index;

  • difference_type- означает тип результата вычитания двух итераторов3.

  • iterator– тип итератора используемого для перечисления элементов вектора. Так например полное название типа итератора для вектора из целых чисел –vector<int>::iterator.

  • reference– тип ссылки на элемент вектора.

  • pointer– тип указателя на элемент вектора.

  • некоторые другие

Определения типов введены для удобства определения типов связанных с определенным контейнером, например вектором. В случае если используемый контейнер будет изменен, например на список, соответственно изменяться определения типов при этом их имена останутся неизменными. Кроме того, данные типа весьма полезна при разработке обобщенного кода на основе шаблонов, так например используя value_typeможно определить переменную типа элемента контейнера

template <class T>

void find_max(const vector<T>& vec)

{

vector<T>::value_type max;

if ( !vec.empty())

{

max = vec[0];

… /* дальнейшие действия */

}

}

Соседние файлы в папке lab1-vector