Урок 95. Введение в std::vector. Векторы

   ⁄ 

 Обновлено 8 Ноя 2017

  ⁄   

⁄  4

В предыдущем уроке мы рассматривали std::array, который является более безопасной и удобной формой обычных фиксированных массивов в C++.

Аналогично, в стандартной библиотеке C++ есть и улучшенная версия динамических массивов, более безопасная и удобная — std::vector.

В отличие от std::array, который недалеко отходит от базовой функциональности обычных фиксированных массивов, std::vector идет в комплекте с дополнительными возможностями, которые делают его одним из самых полезных и универсальных инструментов в C++.

Введение в std::vector

Представленный в C++03, std::vector (или просто вектор) – это тот же динамический массив, но который может сам управлять выделенной себе памятью. Это означает, что вы можете создавать массивы, длина которых задается во время выполнения, без использования операторов new и delete (явного указания выделения и освобождения памяти). std::vector находится в заголовочном файле <vector>.

Объявление std::vector следующее:

Обратите внимание, что и в неинициализированном, что и в инициализированном случаях вам не нужно явно указывать длину array. Это связано с тем, что std::vector динамически выделяет память для своего содержимого по запросу.

Подобно std::array, доступ к элементам массива может выполняться как через оператор [] (который не выполняет проверку диапазона), так и через функцию at() (которая выполняет проверку диапазона):

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

Начиная с C++11, вы также можете присваивать значения std::vector используя список инициализаторов:

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

Нет утечкам памяти!

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

Если value задать значение true, то array никогда не будет удаляться, память никогда не будет освобождаться и произойдет утечка памяти.

Однако, если бы array был вектором, то подобное никогда бы не произошло, так как память освобождалась бы автоматически, как только array вышел бы из области видимости (независимо от того, выйдет ли функция раньше из области видимости или нет). Именно из-за этого использование std::vector является более безопасным, чем динамическое выделение памяти через оператор new.

Векторы отслеживают свою длину

В отличие от стандартных динамических массивов, которые не знают свою длину, std::vector свою длину запоминает. Чтобы её узнать — нужно использовать функцию size():

Результат:

The length is: 7

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

Изменить размер стандартного динамически выделенного массива довольно проблематично и сложно. Изменить размер std::vector так же просто, как вызвать функцию resize():

Результат:

The length is: 7
0 1 2 0 0 0 0

Здесь есть две вещи, на которые следует обратить внимание. Во-первых, когда мы изменили размер array, существующие значения элементов сохранились! Во-вторых, новые элементы были инициализированы значением по умолчанию в соответствии с определенным типом данных (значением 0 в типе int).

Размер вектора также можно изменить и в обратную сторону (обрезать):

Результат:

The length is: 4
0 1 4 7

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

Еще не всё

Это вводная статья, предназначенная для ознакомления с основами std::vector. В уроках следующей главы мы рассмотрим std::vector детальнее, в том числе разницу между длиной и емкостью (capacity) вектора, и то, как в std::vector выполняется выделение памяти.

Всё

Поскольку переменные типа std::vector могут сами управлять выделенной себе памятью (что помогает предотвратить утечку памяти), отслеживают свою длину и легко изменяют свой размер, то мы рекомендуем использовать std::vector вместо стандартных динамических массивов.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (5 оценок, среднее: 4,60 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Комментариев: 4

  1. Zufar:

    Продолжай , всё доступно и понятно! Спасибо за уроки!

    1. Li4ik:

      Спасибо, буду продолжать.

  2. Хочу пройти ваш курс по c++, после всех уроков какой уровень знаний у меня будет?Я выучу весь c++?

    1. Li4ik:

      Вы поймёте всё необходимое для программирования на языке С++.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *