Перейти к основному содержимому

Векторы

Показания датчика поступают в расширяемую последовательность

Обычный массив имеет размер, заданный заранее. Иногда количество значений заранее неизвестно: пользователь вводит несколько измерений, программа собирает данные испытания или список команд растёт по мере настройки. Для этого в C++ есть vector.

Коротко

vector — контейнер стандартной библиотеки, похожий на массив с изменяемым размером. Для него подключают библиотеку <vector>. В этом уроке изучаем только простые операции: создать, добавить, узнать размер, прочитать и изменить элемент.

Первый вектор

#include <iostream>
#include <vector>
using namespace std;

int main() {
vector<int> a;

a.push_back(10);
a.push_back(20);
a.push_back(30);

cout << a[0] << endl;
cout << a[1] << endl;
cout << a[2] << endl;
return 0;
}

Вывод:

10
20
30

push_back добавляет новое значение в конец. После трёх добавлений вектор хранит три элемента с индексами 0, 1, 2.

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

#include <iostream>
#include <vector>
using namespace std;

int main() {
vector<int> a;

cout << a.size() << endl;
a.push_back(5);
cout << a.size() << endl;
a.push_back(8);
cout << a.size() << endl;
return 0;
}

Вывод:

0
1
2

size() показывает, сколько элементов сейчас хранится в векторе.

Изменение элемента

#include <iostream>
#include <vector>
using namespace std;

int main() {
vector<int> a;

a.push_back(10);
a.push_back(20);

a[1] = 99;

cout << a[0] << endl;
cout << a[1] << endl;
return 0;
}

Элемент вектора читается и изменяется почти так же, как элемент массива.

Массив или вектор

СитуацияЧто выбрать
всегда ровно 3 значениямассив
размер известен до запускамассив
значения добавляются во время работыvector
нужно часто менять количество элементовvector

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

Осторожно с индексами

vector тоже начинается с индекса 0. Если в векторе три элемента, индекс 3 запрещён.

#include <iostream>
#include <vector>
using namespace std;

int main() {
vector<int> a;
a.push_back(10);

cout << a[0] << endl;
return 0;
}

Перед чтением элемента убедитесь, что он уже добавлен. Пустой вектор не имеет элемента a[0].

Что пока не делаем

В этом уроке не используем перебор вектора в цикле. Циклы будут изучены позже. После урока про циклы мы вернёмся к обработке наборов значений по счётчику.

Практика

  1. Создайте пустой vector<int>.
  2. Добавьте в него три числа через push_back.
  3. Выведите размер после каждого добавления.
  4. Измените второй элемент и выведите его.
  5. Объясните, чем вектор отличается от массива.

Проверьте себя

  1. Какую библиотеку нужно подключить для vector?
  2. Что делает push_back?
  3. Что показывает size()?
  4. С какого индекса начинается вектор?
  5. Почему нельзя читать a[0] у пустого вектора?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

  • формулируете основную мысль своими словами;
  • называете важные условия, ограничения или меры безопасности;
  • для схемы, кода или расчёта показываете ход решения и ожидаемый результат.

Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.

Словарь статьи

ТерминЗначение
контейнеробъект для хранения набора значений
vectorконтейнер изменяемого размера
push_backдобавление элемента в конец
sizeтекущее количество элементов
индексномер элемента

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

Источники