Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Использование контейнера vector




Контейнер vector, в отличие от классов CArray, CList и CMap библиотеки MFC, относится к средствам стандартной библиотеки языка С++ и его надо рассматривать как альтернативу CArray. Использование vector однозначно целесообразно в приложениях, которые предполагается использовать на разных программных платформах.

Класс vector представляет собой шаблонный класс для последовательных контейнеров, которые манипулируют элементами данного типа в линейной последовательности (in a linear arrangement) и позволяют быстрый произвольный доступ к любому элементу. Классы на основе этого шаблона являются наиболее предпочтительными контейнерами для наборов элементов, к которым требуется иметь высокоэффективный произвольный доступ.

Объявление шаблона:

template <

class Type,

class Allocator = allocator<Type>

>

class vector

 

Параметры шаблона:

Type

Тип элементов, сохраняемых в векторе 

Allocator

Тип, который представляет собой объект, предназначенный для управления распределением памяти для вектора. Этот параметр не является обязательным и его можно не указывать. Значение параметра по умолчанию – allocator<Type>.

 

Замечания.

Операции добавления элементов вектора в его конец, равно как и удаления его последних элементов требуют минимального времени и выполняются эффективно, в то время как выполнение таких операций применительно к элементам в середине вектора требуют больших затрат времени. Эффективное выполнение операций с элементами вектора, находящимися в его начале или конце, обеспечивает контейнер deque. Наконец, контейнер list наиболее предпочтителен для тех задач, где требуется вставлять и удалять элементы в/из любого места последовательности.

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

Класс vector<bool> представляет собой полную специализацию (full specialization) шаблонного класса для элементов булевского типа с распределителем памяти, используемым специализацией для базового типа.

Описания типов (Typedefs) класса vector представлены в табл.1, компонентные функции – в табл.2, операции – в табл. 3.

Таблица 1

Описания типов класса vector

Имя типа Описание назначения
allocator_type Тип класса распределителя памяти для объектов вектора
const_iterator Тип, представляющий собой итератор произвольного доступа, который может читать константные элементы вектора
const_pointer Тип, представляющий указатель на константный элемент вектора
const_reference Тип, представляющий ссылку на константный элемент вектора и используемый для чтения и выполнения константных операций
const_reverse_iterator Тип, представляющий собой итератор произвольного доступа, который может читать любые константные элементы «реверсированного» вектора
difference_type Тип, представляющий разность адресов двух элементов вектора
iterator Тип, представляющий собой итератор произвольного доступа, который может читать или модифицировать любые элементы вектора
pointer Тип, представляющий указатель на элемент вектора
reference Тип, представляющий ссылку на элемент вектора, т.е. на value_type
reverse_iterator Тип, представляющий собой итератор произвольного доступа, который может читать или модифицировать любые элементы реверсированного вектора
size_type Беззнаковый целочисленный тип, представляющий объект, который представляет длину любой последовательности
value_type Тип данных элементов вектора

 

Таблица 2

Компонентные функции класса vector

Имя функции Назначение функции
assign Очищает вектор и копирует указанные элементы в пустой вектор
at Возвращает ссылку на элемент в указанной позиции вектора
back Возвращает ссылку на последний элемент вектора
begin Возвращает итератор произвольного доступа, указывающий на первый элемент вектора
capacity Возвращает число элементов, которые вектор может содержать без распределения дополнительной памяти
clear Удаляет все элементы вектора
empty Возвращает значение true, если вектор пустой
end Возвращает итератор произвольного доступа, указывающий на элемент вектора, следующий за последним
erase Удаляет один или несколько элементов вектора, начиная с указанной позиции
front Возвращает ссылку на первый элемент вектора
get_allocator Возвращает объект, который используется классом вектор для распределения памяти
insert Вставляет один или несколько элементов вектора, начиная с указанной позиции
max_size Возвращает максимально возможное число элементов вектора
pop_back Удаляет последний элемент вектора, который не должен быть пустым
push_back Добавляет элемент в конец вектора
rbegin Возвращает итератор произвольного доступа, указывающий на первый элемент реверсированного вектора
rend Возвращает итератор произвольного доступа, указывающий на элемент, следующий за последним элементом реверсированного вектора
resize Устанавливает новую длину вектора и заполняет новые элементы заданным значением
reserve Резервирует минимальную длину вектора
size Возвращает число элементов вектора
swap Обменивает содержимое двух векторов друг с другом
vector Перегруженные конструкторы, предназначенные для создания вектора

 

Таблица 3

Перегруженные операции класса vector

operator[] Возвращает ссылку на элемент вектора в указанной позиции

Конструкторы

Восемь конструкторов предназначены для создания (конкретного) класса вектор различными способами: изначально пустого вектора, вектора с заданным начальным числом элементов и т.д.

Все конструкторы запоминают объект-распределитель памяти (allocator) и инициализируют вектор.

 

 

Замечание. Ключевое слово explicit (явный) используется для обозначения того, что конструктор должен вызываться только явно. Другими словами, компилятор не должен использовать этот конструктор для неявного приведения типа. Поясним это на простом примере: #include <vector> … vector <double> Vec(10); vector <double> Vec2=20;   Если бы второй конструктор класса vector не был бы объявлен как explicit, то определение вектора Vec2 было бы допустимо и трактовалось бы как vector <double> Vec2=vector(20), что может восприниматься неоднозначно.  

 

Параметры конструкторов:

 

 

Имя параметра Описание
_Al Класс распределитель памяти джля элементов вектора. Функция get_allocator() возвращает этот класс для объекта вектор
_Count Число элементов создаваемого вектора
_Val Значение элементов создаваемого вектора
_Right Вектор оригинал, на основе которого создается данный вектор с помощью конструктора копирования
_First Позиция первого элемента в диапазоне копируемых элементов вектора
_Last Позиция элемента вектора, следующая за последней позицией диапазона

 

Смысл значений итераторов вроде First и Last может прояснить следующая схема для вектора, состоящего из трех элементов (рис. 1).

 

Рис. 1. Смысл итераторов First и Last

Замечание. Понятие итераторов и особенности их определения можно найти в работе «Пол__Объектно-ориентированное_программирование_на_С++.pdf» с. 252. Кроме того, они хорошо описаны у Страуструпа (разд. 3.8)

 

Конструкторы класса vector:

1. vector(); Создание изначально пустого вектора

2. explicit vector( const Allocator& _Al); Создание изначально пустого вектора и задание объекта-распределителя памяти

3. explicit vector( size_type _Count); задает число элементов вектора _Count со значениями по умолчанию для типа элементов вектора.

4. vector( size_type _Count, const Type& _Val); задает число элементов вектора _Count с заданными начальными значениями _Val.

5. vector( size_type _Count, const Type& _Val, const Allocator& _Al);  то же, что и предыдущий конструктор, плюс задание объекта-распределителя памяти

6. vector(const vector<Type, Allocator>& _Right); создает вектор-копию вектора-оригинала

7. template<class InputIterator>  

vector(InputIterator _First,InputIterator _Last); создает вектор-копию на основе заданного диапазона элементов [_First, _Last)  вектора-оригинала

8. template<class InputIterator>

vector(InputIterator _First,InputIterator _Last,

9. const Allocator& _Al); то же, что и предыдущий конструктор, плюс задание объекта-распределителя памяти

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 462.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...