Классы контейнеров C++<array>
Стандарт C++11 ввёл<array>Заголовочный файл предоставляет контейнер массива фиксированного размера, который обеспечивает лучшую типобезопасность и характеристики управления памятью по сравнению с массивами в C.
std::arrayЭто шаблонный класс в стандартной библиотеке C++, определённый в<array>В заголовочном файле.std::arrayШаблонный класс предоставляет массив фиксированного размера, размер которого определяется во время компиляции и не может быть изменён динамически.
Синтаксис
std::arrayБазовый синтаксис выглядит следующим образом:
#include <array> std::array<T, N> array_name;
T— это тип элементов массива.NЭто размер массива, и он должен быть неотрицательным целым числом.
Объявление и инициализация
<array>Размер должен быть определён во время компиляции и не может изменяться динамически. Пример использования:
#include <iostream>
#include <array>
int main() {
std::array<int, 5> arr = {1, 2, 3, 4, 5}; // 声明一个定长为5的int数组
return 0;
}
Особенности
- Типобезопасность:
std::arrayОбеспечивает проверку типов, избегая проблем с типобезопасностью массивов языка C. - Фиксированный размер: размер массива определяется во время компиляции и не может быть изменён во время выполнения.
- Непрерывная память:
std::arrayЭлементы хранятся в памяти непрерывно, что обеспечивает эффективный доступ к элементам. - Стандартный контейнер:
std::arrayпредоставляетstd::vectorПохожие интерфейсы, такие какsize(),at(),front(),back()и т. д.
Пример
Ниже приведён пример использованияstd::arrayПростой пример, включая результаты вывода.
Пример
#include <array>
int main() {
// Создать std::array, содержащий 5 целых чисел
std::array<int, 5> myArray = {1, 2, 3, 4, 5};
// Использовать цикл for на основе диапазона для перебора массива
for (const auto& value : myArray) {
std::cout << value << " ";
}
std::cout << std::endl;
// Доступ к элементам массива по индексу
std::cout << "Элемент с индексом 2: " << myArray.at(2) << std::endl;
// Получить размер массива
std::cout << "Размер массива: " << myArray.size() << std::endl;
// Изменить элементы массива
myArray[3] = 10;
// Снова пройдите по массиву, чтобы отобразить изменённые элементы
for (const auto& value : myArray) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
Вывод:
1 2 3 4 5 Element at index 2: 3 Array size: 5 1 2 3 10 5
Общие функции-члены
Ниже приведены<array>Некоторые часто используемые функции-члены в:
| Функция | Описание |
|---|---|
at(size_t pos) |
Возвращает элемент в указанной позиции с проверкой границ |
operator[] |
Возвращает элемент в указанной позиции без проверки границ |
front() |
Возвращает первый элемент массива |
back() |
Возвращает последний элемент массива |
data() |
Возвращает указатель на данные массива |
size() |
Возвращает размер массива (фиксированный и неизменный) |
fill(const T& value) |
Устанавливает все элементы массива в указанное значение |
swap(array& other) |
Обменивает содержимое двух массивов |
begin() / end() |
Возвращает итераторы begin/end массива |
Пример
1. Базовые операции
Пример
#include <array>
int main() {
std::array<int, 5> arr = {10, 20, 30, 40, 50};
std::cout << "Элементы массива: ";
for (int i = 0; i < arr.size(); ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
// Получить первый и последний элементы
std::cout << "Первый элемент: " << arr.front() << std::endl;
std::cout << "Последний элемент: " << arr.back() << std::endl;
return 0;
}
Использование at и проверки границ
Пример
#include <array>
int main() {
std::array<int, 3> arr = {1, 2, 3};
try {
std::cout << arr.at(2) << std::endl; // Обычный вывод
std::cout << arr.at(5) << std::endl; // Выход за границы, выбрасывает исключение
} catch (const std::out_of_range& e) {
std::cout << "Исключение: " << e.what() << std::endl;
}
return 0;
}
3. Использование fill для заполнения элементов
Пример
#include <array>
int main() {
std::array<int, 5> arr;
arr.fill(100); // Установить все элементы в 100
std::cout << "Заполненный массив: ";
for (const auto& elem : arr) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
4. Обмен массивами
Пример
#include <array>
int main() {
std::array<int, 3> arr1 = {1, 2, 3};
std::array<int, 3> arr2 = {4, 5, 6};
arr1.swap(arr2);
std::cout << "Массив 1: ";
for (const auto& elem : arr1) {
std::cout << elem << " ";
}
std::cout << std::endl;
std::cout << "Массив 2: ";
for (const auto& elem : arr2) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
Сравнение с другими типами массивов
| Особенности | std::array | Массивы в стиле C | std::vector |
|---|---|---|---|
| Size | Фиксируются во время компиляции | Фиксируются во время компиляции | Динамически изменяемый |
| Проверка границ | at()Обеспечивает проверку границ | Отсутствует | at()Обеспечивает проверку границ |
| Управление памятью | Выделение в стеке | Выделение в стеке | Выделение в куче |
| Производительность | Эффективный | Эффективный | Ниже (динамически выделяемый) |
| interface | Поддерживает стандартный интерфейс STL | Не поддерживает стандартный интерфейс STL | Поддерживает стандартный интерфейс STL |
std::arrayЭто очень полезный контейнер в стандартной библиотеке C++, предоставляющий массивы фиксированного размера с преимуществами типобезопасности и управления памятью. Из приведённых выше примеров видно, как создавать, получать доступ и изменятьstd::arrayэлементы. Для сценариев, требующих массивов фиксированного размера,std::arrayявляется очень хорошим выбором.