Векторы в STL

Векторы в STLЕсли в середине программы нам нужно сохранить больше элементов в массиве, то это становится невозможным, и мы обязательно получим исключение ‘out_of_bound’ в тот момент, когда попытаемся сохранить элементы за пределами массива.

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

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

Что такое векторы?

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

Как и массивы, векторные элементы можно просматривать и получать к ним доступ с помощью итераторов.

Объявление вектора в C++ с помощью класса std::Vector

В векторном классе STL ‘ std::vector ‘ определяется под заголовком <vector> . Таким образом, чтобы использовать векторный контейнер, мы должны включить этот заголовок в нашу программу, как показано ниже:

#include <vector>

Мы можем объявить пустой вектор так:

std::vector<int> myvec;

Приведенная выше строка кода создаст вектор с элементами целочисленного типа. В памяти это отобразится как myvec.

Инициализация вектора

Мы можем инициализировать вектор значением во время его объявления.

Это делается следующим образом:

В приведенном выше коде мы объявляем вектор типа int с именем myvec, содержащий первые пять элементов последовательности Фибоначчи.

Расположение памяти этого вектора будет следующим:

Расположение памяти вектора

Векторный итератор

Как уже упоминалось, мы используем итераторы для последовательного обхода вектора.

Векторы поддерживают следующие функции итератора для пошагового перемещения по элементам:

  • begin() — возвращает итератор, указывающий на первый элемент векторного контейнера.
  • end() — возвращает итератор, указывающий на элемент, следующий за последним элементом в векторе.
  • rbegin() — возвращает обратный итератор, указывающий на последний элемент векторного контейнера.
  • rend() — возвращает обратный итератор, указывающий на первый элемент векторного контейнера.
  • cbegin() — возвращает постоянный итератор, указывающий на первый элемент в векторном контейнере.
  • cend() — возвращает постоянный итератор, указывающий на элемент, следующий за последним элементом векторного контейнера.
  • crbegin() — возвращает обратный константный итератор, указывающий на последний элемент в векторном контейнере.
  • crend() — возвращает обратный константный итератор, указывающий на первый элемент в векторном контейнере.

Давайте рассмотрим на пример, демонстрирующий эти функции итератора:

Вывод данных:

Output of Vector with begin and end: 2 3 4 5 6
Output of Vector with rbegin and rend: 6 5 4 3 2
Output Vector of with cbegin and cend: 2 3 4 5 6
Output Vector of with crbegin and crend: 6 5 4 3 2

Таким образом, в этом коде мы объявляем вектор и вставляем в него значения с помощью функции push_back. Затем мы отображаем векторы, используя каждую из описанных выше функций итератора. Как видно из вывода данных, в зависимости от используемых функций итератора порядок отображения вектора меняется.

Читать также:  Введение в объектно-ориентированное программирование на C++

Векторные функции

Сортировка вектора

Мы можем использовать алгоритмы STL, которые вы уже видели в векторе.

Ниже приведен пример использования «Сортировки» (sort) для вектора:

Вывод данных:

Original Vector
10 50 30 20 60 40
Sorted Vector
10 20 30 40 50 60

В приведенном выше примере мы инициализировали вектор, а затем применили алгоритм сортировки для сортировки вектора.

Печать элементов вектора

Векторы можно распечатать с помощью итератора и потока ‘cout’. Мы можем использовать итератор, чтобы пройтись по каждому элементу вектора и напечатать их с помощью cout.

Следующий пример демонстрирует это:

Вывод данных:

Output of Vector with begin and end: 3 4 5 6 7

Функции вектора

Существуют различные функции, которые воздействуют на векторы для определения их размера, максимальный размера и т.д.

Мы перечислили эти функции ниже:

Размер вектора

Функция size() возвращает количество элементов в векторном контейнере. Это встроенная функция класса std::vector, и ее можно использовать непосредственно для определения размера вектора.

Давайте посмотрим на пример вектора с использованием функции size():

Вывод данных:

Vector Size: 6

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

Изменение размера вектора

Мы также можем изменить размер вектора до желаемого размера, т.е., чтобы он мог содержать n элементов. Это достигается функцией resize() класса std::vector. Функция resize принимает размер вектора в качестве параметра, а затем изменяет размер векторного контейнера до указанного размера.

Давайте разберемся в этом с помощью примера ниже:

Вывод данных:

Vector elements are: 1 1 2 3 5 8
Vector Size after resize: 4
Vector elements after resizing are: 1 1 2 3

В приведенной выше программе мы сначала определяем вектор myvec размера 6. Затем мы вызываем функцию изменения размера этого вектора с размером = 4. Это означает, что теперь мы хотим изменить размер нашего вектора до размера 4.

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

Помимо функций размера и изменения размера, векторный класс также поддерживает еще несколько функций, которые позволяют нам управлять емкостью вектора:

  • max_size(): возвращает максимальный размер, т.е. максимальное количество элементов, которые может содержать вектор.
  • capacity(): возвращает размер выделенного в данный момент места для хранения (возвращает с точки зрения количества элементов).
  • empty(): проверяет, пуст ли контейнер.
  • shrink_to_fit(): уменьшает емкость вектора, чтобы соответствовать размеру и отбрасывает все остальные элементы.
  • backup(): резервирует емкость вектора, чтобы содержать n элементов.

Читать также:  Структура данных связного списка в C++

Векторные модификаторы

Модификаторы — это операции или функции, которые можно использовать для изменения содержимого векторного контейнера. Мы покажем некоторые из основных функций, которые используются в качестве модификаторов.

Присвоение новых значений вектору

Одной из функций-модификаторов, предоставляемых std::vector, является функция назначения. Функция Assign присваивает вектору новые значения, заменяя старые.

Это демонстрируется в следующем примере:

Вывод данных:

The vector elements: 10 10 10 10 10

В приведенном выше коде мы объявляем вектор типа int. Затем мы вызываем функцию assign с параметрами 5, 10. Это означает, что мы намерены присвоить элемент 10 вектору 5 раз. Когда мы отображаем вектор, мы видим, что вектор имеет 5 элементов, все со значением 10.

Стирание вектора

Следующая функция, предоставляемая std::vector для изменения вектора, — это функция «стирание». Функция Erase удаляет элементы из указанного диапазона или позиции из вектора.

Давайте рассмотрим это на примере ниже:

Вывод данных:

Vector elements:1 1 2 3 5
Vector size after erase: 4
Vector after erase operation: 1 2 3 5

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

Вставка значений в вектор

Векторный класс std::vector предоставляет еще одну функцию для вставки значений в вектор. Функция Insert позволяет нам вставлять элементы в вектор перед указанной позицией.

Давайте рассмотрим данный пример:

Вывод данных:

Initial vector: 2 3 4
New vector after insert: 20 30 2 3 4

Вышеприведенная программа изначально объявляет вектор с 3 элементами. Затем мы дважды вызываем функцию вставки, чтобы вставить значения 20 и 30 в первую и вторую позиции вектора соответственно. Затем мы отображаем измененный вектор.

Замена содержимого вектора

Класс вектора дает нам возможность менять местами или обменивать содержимое одного вектора на содержимое другого вектора того же типа и размера. Это достигается за счет встроенной в вектор функции swap.

Рассмотрим следующий фрагмент кода:

Вывод данных:

Vector 1: 1 3
Vector 2: 5 7
After Swap
Vector 1: 5 7
Vector 2: 1 3

Приведенный выше код показывает содержимое двух векторов до и после замены.

Очистка значений в векторе

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

Приведенная ниже программа демонстрирует четкую функцию векторного контейнера:

Вывод данных:

Size of vector v1: 4
Vector 1: 1 3 5 7
Size of vector v1 after call to clearfunction : 0

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

Читать также:  Структура данных циклического связного списка в C++

at(pos)

Эта функция возвращает ссылку на элемент в позиции ‘pos’ внутри вектора. Это одна из функций, которая используется для доступа к элементу вектора.

Пример приведен ниже:

Вывод данных:

Element at position 3 : 3

Как показано в примере, функция at используется для доступа к элементу вектора в указанной позиции.

Front

Функция front возвращает ссылку на первый элемент вектора. Это еще одна функция, которую мы используем для доступа к элементам векторного контейнера.

В следующем примере показано использование функции «front»:

Вывод данных:

Input vector: 1 1 2 3 5 8
Element at the front of vector: 1

Back

Подобно функции «front», функция «back» используется для доступа к последнему элементу векторного контейнера. Функция «back» возвращает ссылку на последний элемент в векторном контейнере.

В следующем примере показано использование функции «back»:

Вывод данных:

Input vector: 1 1 2 3 5 8
Element at the back of vector: 8

Поиск элемента в векторе

Функция «find» используется для определения того, присутствует ли определенный элемент (называемый ключом) в векторе или нет. Эта функция должна быть быстрой и эффективной. Как только значение найдено, функция возвращается.

В следующем примере показано использование функции «find»:

Вывод данных:

Input vector: 1 1 2 3 5 8
Enter the key to be searched: 0

Как вы можете видеть, данный элемент в программе не найден.

2D вектор

Двумерный вектор также известен как «Вектор векторов». Также, как и двумерные массивы, элементы двумерных векторов располагаются в матричном виде.

Пример программы для 2D-вектора приведен ниже:

Вывод данных:

2D vector :
1 3 5
7 9 11
13 15 17

В приведенном выше примере обратите внимание на способ определения двумерного вектора. Он определяется как вектор внутри другого вектора. При отображении этого 2D-вектора мы используем тот же подход, что и при отображении 2D-массивов.

Пример вектора

Ниже приведен векторный пример, который содержит большинство векторных операций:

Вывод данных:

The vector elements: 10 10 10 10 10
The new vector after push_back:10 10 10 10 10 5
New vector after pop_back : 10 10 10 10 10
New vector after insert: 20 10 10 10 10 10
Vector size after erase: 5
After erase first element: 10 10 10 10 10

В приведенном выше примере мы объявляем вектор, а затем, используя функции assign и push_back, вводим элементы в вектор. Затем мы используем функцию pop_back для удаления элемента в конце вектора. После этого мы снова добавляем один элемент в вектор с помощью элемента вставки, а затем стираем элемент с помощью функции стирания.

Это сквозной пример векторного контейнера, демонстрирующий его различные функции.

Итог

На этом мы подошли к концу данной статьи по вектору. В нашей следующей статье вы узнаем все о списках в STL и познакомитесь с их реализацией.

С Уважением, МониторБанк

Добавить комментарий