C++. Класс vector. Динамический массив. Общие сведения

Класс vector. Динамический массив. Общие сведения. Обзор методов. Создание динамического массива. Способы доступа к элементам вектора

Данная тема является началом изучения средств класса vector, который представляет собой динамический массив.


Содержание


Поиск на других ресурсах:

1. Общие сведения о классе vector. Обзор методов класса

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

Чтобы использовать методы и константы массива типа vector нужно подключить заголовок <vector> и пространство имен std

#include <vector>
using namespace std;

Шаблонная спецификация класса vector имеет следующий вид:

template <class T, class Allocator = allocator<T> > class vector

здесь

  • T – тип элементов массива. Это может быть любой базовый тип (int, float, char и т.д.) или тип, разработанный пользователем;
  • Allocator — название класса, обеспечивающего распределение памяти.

Методы класса vector можно условно разбить на 3 группы:

  • 1. Методы, определяющие и изменяющие общие характеристики массива.
    • 1.1. Метод size(). Определить размер вектора
    • 1.2. Метод max_size(). Максимально допустимый размер массива
    • 1.3. Метод capacity(). Определить размер массива с учетом зарезервированной памяти
    • 1.4. Метод empty(). Определить, пустой ли вектор
    • 1.5. Метод shrink_to_fit(). Выровнять размер массива с учетом зарезервированной памяти по фактическому размеру массива
    • 1.6. Метод reserve(). Зарезервировать память для дополнительных элементов массива
    • 1.7. Метод resize(). Изменить размер массива
  • 2. Методы, модифицирующие (изменяющие) данные в массиве
    • 2.1. Метод push_back(). Добавить элемент в конец вектора
    • 2.2. Метод pop_back(). Удалить последний элемент вектора
    • 2.3. Метод clear(). Удаляет из массива все элементы
    • 2.4. Метод swap(). Обмен местами двух векторов
    • 2.5. Присваивание массивов. Перегруженный оператор =
    • 2.6. Метод erase(). Удалить один или несколько элементов заданного диапазона
    • 2.7. Метод insert(). Вставляет элемент или группу элементов в вектор
      • 2.7.1. Вставка списка инициализации в вектор
      • 2.7.2. Вставка элемента заданное количество раз в заданную позицию
      • 2.7.3. Вставка одиночного элемента в заданную позицию
      • 2.7.4. Вставка нескольких элементов из заданного диапазона
    • 2.8. Метод assign(). Создать массив из существующих данных
  • 3. Методы, обеспечивающие доступ к элементам массива
    • 3.1 Метод at(). Получить элемент вектора по его позиции (индексу)
    • 3.2. Метод front(). Возвращает ссылку на первый элемент вектора
    • 3.3. Метод back(). Возвращает ссылку на последний элемент вектора
    • 3.4. Метод data(). Получить указатель на вектор
    • 3.5. Метод begin(). Вернуть итератор, указывающий на первый элемент вектора
    • 3.6. Метод end(). Вернуть итератор, указывающий на последний элемент массива
    • 3.7. Методы cbegin(), cend(). Получить константный итератор на начало и конец массива
    • 3.8. Методы rbegin(), rend(). Доступ к элементам массива с помощью реверсного итератора
    • 3.9. Методы crbegin(), crend​​(). Установить на начало и конец массива константный реверсный итератор

 

2. Создание динамического массива типа vector. Конструкторы. Пример

Для создания массива в классе vector объявляется ряд конструкторов. Ниже приведены наиболее распространенные из них.

Чтобы создать пустой массив используется конструктор:

explicit vector(const Allocator &a = Allocator());

Чтобы создать массив, который содержит num элементов со значением val, используется конструктор

explicit vector(size_t num, const T &val = T(),
const Allocator &a = Allocator());

Чтобы создать массив на основе другого массива ob, нужно использовать конструктор

vector(const vector<T, Allocator> &ob);

Чтобы создать массив на основе диапазона на который указывают итераторы start и end, используется следующий конструктор

template <class InIter> vector<InIter start, InIter end,
const Allocator &a = Allocator());

Пример. В примере создаются различные массивы типа vector.

#include <vector>
using namespace std;

...

// 1. Создать вектор из 10 чисел типа int
vector<int> A1(10);

// 2. Создать пустой вектор, элементы которого имеют тип char
vector<char> A2;

// 3. Создать вектор из 5 чисел типа double,
//     записать в вектор значения 1.0
vector<double> A3(5, 1.0);

// 4. На основании вектора A3 создать новый вектор A4
vector<double> A4(A3);

// 5. Создать вектор на основании итераторов, которые указывают на
//     элементы вектора A4 с индексами от 0 до 1.
vector<double>::iterator start, end; // объявить итераторы
start = A4.begin();   // установить первый итератор на позицию 0
end = A4.begin() + 2; // второй итератор в позиции 2 (позиция после 1)
vector<double> A5(start, end); // создать вектор

...

 

3. Способы доступа к элементам вектора. Индексирование [ ]

После создания вектора, можно получать доступ к его элементам одним из следующих способов:

  • с помощью операции индексирования [ ], как в случае с обычным массивом;
  • с помощью итератора;
  • с помощью метода at().

Примеры доступа к элементам вектора.

#include <vector>
using namespace std;

...

// 1. Доступ к вектору з помощью индексатора []
// 1.1. Создать вектор из 5 чисел типа int
vector<int> A1(5);

// 1.2. Записать в вектор значение [ 1, 2, 3, 4, 5 ]
for (int i = 0; i < A1.size(); i++)
  A1[i] = i + 1;

// 1.3. Вывести вектор на экран
for (int i = 0; i < A1.size(); i++)
  cout << A1[i] << " ";
cout << endl;

// 2. Доступ к элементам вектора с помощью итераторов
// 2.1. Создать вектор из 5 чисел типа float
vector<float> A2(5);

// 2.2. Объявить итератор на вектор типа float
vector<float>::iterator p;

// 2.3. Записать в вектор числа [ 1.1, 2.2, 3.3, 4.4, 5.5 ]
//      с помощью итератора
p = A2.begin();
int i = 0;
while (p != A2.end())
{
  *p = (float)((i + 1) + (i + 1) * 0.1);
  p++;
  i++;
}

// 2.4. Вывести вектор с помощью итератора
p = A2.begin();
while (p != A2.end())
{
  cout << *p << " ";
  p++;
}
cout << endl;

// 3. Доступ к элементам вектора с помощью метода at()
// Метод at() - получить элемент вектора по его позиции
vector<double> A3(5); // Создать массив из 5 элементов типа double

// Заполнить произвольными значениями
A3.at(0) = 2.8; // A3[0] = 2.8;
A3.at(1) = 3.3; // A3[1] = 3.3;

...

 


Связанные темы