Вектор, std::array и массив C
Сравнивайте три последовательных контейнера и выбирайте один с учётом размера, владения и производительности.
«Вектор, std::array и массив C» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Три последовательных контейнера
В C++ есть три способа хранить непрерывную последовательность:
- std::vector — динамический размер, хранение в куче
- std::array — фиксированный размер во время компиляции, хранение в стеке
- Массив в стиле C — фиксированный размер, низкоуровневый
Массивы в стиле C
Самая старая форма. Размер является частью типа. При передаче в функции преобразуется в указатель — размер теряется.
int a[5] = {1, 2, 3, 4, 5};
std::cout << a[2]; // 3Проблемы массивов в стиле C
В большинстве контекстов они теряют информацию о размере, не проверяют выход за границы и легко приводят к ошибкам. В новом коде лучше использовать std::array или std::vector.
std::array (C++11)
Тонкая оболочка над массивом фиксированного размера. Производительность такая же, как у массива C, но есть полноценный тип и корректные функции-члены.
#include <array>
std::array<int, 5> a = {1, 2, 3, 4, 5};
std::cout << a.size(); // 5
std::cout << a.at(2); // bounds-checkedstd::array хранится в стеке
В отличие от вектора, std::array хранит свои элементы непосредственно. Выделения памяти в куче нет. Размер является параметром шаблона.
std::vector для динамического размера
Используйте std::vector, когда размер неизвестен во время компиляции или будет изменяться во время выполнения.
Сравнение производительности
При фиксированных размерах все три варианта работают примерно одинаково. std::vector добавляет небольшие накладные расходы на хранение указателя и размера, а также одну косвенную адресацию.
Передача в функции
Передавайте вектор или std::array по константной ссылке, чтобы избежать копирования. Массивы C при передаче без владения следует заменять на std::span (C++20).
void process(const std::vector<int>& v);
void process(const std::array<int, 5>& a);
#include <span>
void process(std::span<const int> data); // accepts bothstd::span (C++20)
Невладеющее представление непрерывной последовательности. Подобно паре «указатель + длина». Единообразно работает с векторами, std::array и массивами C.
Как выбрать подходящий вариант
Дерево решений:
- Нужен динамический размер →
std::vector - Фиксированный размер, без выделения памяти →
std::array - Передача без владения →
std::span - Совместимость с кодом на C → массив C
Преобразование между ними
Элементы можно копировать между типами с помощью диапазонов или алгоритмов.
std::array<int, 3> a = {1, 2, 3};
std::vector<int> v(a.begin(), a.end());
int c[3];
std::copy(a.begin(), a.end(), c);Быстрая проверка
Какой контейнер хранит элементы в стеке и имеет размер, известный во время компиляции?
Итоги
Предпочитайте std::vector для динамического размера, а std::array — для фиксированного. Массивы в стиле C редко бывают лучшим выбором в современном коде. Используйте std::span, чтобы передавать последовательность без владения ею.
Часто задаваемые вопросы
Урок «Вектор, std::array и массив C» бесплатный?
Да — полный текст урока «Вектор, std::array и массив C» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Вектор, std::array и массив C»?
Сравнивайте три последовательных контейнера и выбирайте один с учётом размера, владения и производительности. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Вектор, std::array и массив C»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы std::vector: push_back, size, capacity
- Перебор векторов: индекс, range-for, итераторы
- Изменение векторов: insert, erase, clear
- Вектор, std::array и массив C