std::array
Определён в заголовочном файле <array> | ||
|---|---|---|
template<
class T,
std::size_t N
> struct array;
| (начиная с C++11) |
std::array — это контейнер, инкапсулирующий массивы фиксированного размера.
Этот контейнер является агрегатным типом с той же семантикой, что и структура, содержащая массив в стиле C T[N] в качестве единственного нестатического члена данных. В отличие от массива в стиле C, он не преобразуется автоматически в T*. Будучи агрегатным типом, он может быть инициализирован с помощью агрегатной инициализации не более чем N инициализаторами, преобразуемыми в T: std::array<int, 3> a = {1, 2, 3};.
Эта структура сочетает производительность и доступность массива в стиле C с преимуществами стандартного контейнера, такими как знание собственного размера, поддержка присваивания, итераторы произвольного доступа и т. д.
std::array удовлетворяет требованиям Container и ReversibleContainer, за исключением того, что массив, созданный по умолчанию, не пуст, а сложность операции обмена линейна; удовлетворяет требованиям ContiguousContainer,(начиная с C++17) и частично удовлетворяет требованиям SequenceContainer.
Предусмотрен особый случай для массива нулевой длины (N == 0). В этом случае array.begin() == array.end(), имеющее некоторое уникальное значение. Поведение при вызове front() или back() для массива нулевого размера не определено.
Массив также можно использовать как кортеж из N элементов одного типа.
Инвалидация итераторов
Как правило, итераторы массива никогда не инвалидируются в течение всего времени жизни массива. Однако следует учитывать, что во время операции swap итератор продолжит указывать на тот же элемент массива, и поэтому его значение изменится.
Параметры шаблона
| T | - | тип элемента. Требования к элементам зависят от фактически выполняемых над контейнером операций. Как правило, тип элемента должен быть полным типом и удовлетворять требованиям Erasable, однако некоторые функции-члены предъявляют более строгие требования |
| N | - | количество элементов в массиве (может быть 0) |
Типы-члены
| Тип-член | Определение | ||||||
|---|---|---|---|---|---|---|---|
value_type |
T |
||||||
size_type |
std::size_t |
||||||
difference_type |
std::ptrdiff_t |
||||||
reference | value_type& | ||||||
const_reference | constvalue_type& | ||||||
pointer | value_type* | ||||||
const_pointer | constvalue_type* | ||||||
iterator |
|
||||||
const_iterator |
|
||||||
reverse_iterator | std::reverse_iterator<iterator> | ||||||
const_reverse_iterator | std::reverse_iterator<const_iterator> |
Функции-члены
Неявно определённые функции-члены |
|
|
(constructor)
(объявлен неявно) | инициализирует массив согласно правилам агрегатной инициализации (обратите внимание, что инициализация по умолчанию может привести к неопределённым значениям для неклассовых T) (открытая функция-член) |
|
(destructor)
(объявлен неявно) | уничтожает каждый элемент массива (открытая функция-член) |
|
operator=
(объявлен неявно) | заменяет каждый элемент массива соответствующим элементом другого массива (открытая функция-член) |
Доступ к элементам |
|
| доступ к указанному элементу с проверкой границ (открытая функция-член) |
|
| доступ к указанному элементу (открытая функция-член) |
|
| доступ к первому элементу (открытая функция-член) |
|
| доступ к последнему элементу (открытая функция-член) |
|
| прямой доступ к базовому непрерывному хранилищу (открытая функция-член) |
|
Итераторы |
|
| возвращает итератор на начало (открытая функция-член) |
|
| возвращает итератор на конец (открытая функция-член) |
|
| возвращает обратный итератор на начало (открытая функция-член) |
|
| возвращает обратный итератор на конец (открытая функция-член) |
|
Ёмкость |
|
| проверяет, пуст ли контейнер (открытая функция-член) |
|
| возвращает количество элементов (открытая функция-член) |
|
| возвращает максимально возможное количество элементов (открытая функция-член) |
|
Операции |
|
| заполняет контейнер указанным значением (открытая функция-член) |
|
| обменивает содержимое (открытая функция-член) |
|
Функции, не являющиеся членами
|
(C++11)(C++11)(удалён в C++20)(C++11)(удалён в C++20)(C++11)(удалён в C++20)(C++11)(удалён в C++20)(C++11)(удалён в C++20)(C++20) | лексикографически сравнивает значения двух array (шаблон функции) |
|
(C++11) | получает доступ к элементу array (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++20) | создаёт объект std::array из встроенного массива (шаблон функции) |
Вспомогательные классы
|
(C++11) | получает размер array (специализация шаблона класса) |
|
(C++11) | получает тип элементов array (специализация шаблона класса) |
Руководства по выводу типов | (начиная с C++17) |
Пример
#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>
#include <string>
int main()
{
// Construction uses aggregate initialization
std::array<int, 3> a1{{1, 2, 3}}; // Double-braces required in C++11 prior to
// the CWG 1270 revision (not needed in C++11
// after the revision and in C++14 and beyond)
std::array<int, 3> a2 = {1, 2, 3}; // Double braces never required after =
// Container operations are supported
std::sort(a1.begin(), a1.end());
std::ranges::reverse_copy(a2, std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
// Ranged for loop is supported
std::array<std::string, 2> a3{"E", "\u018E"};
for (const auto& s : a3)
std::cout << s << ' ';
std::cout << '\n';
// Deduction guide for array creation (since C++17)
[[maybe_unused]] std::array a4{3.0, 1.0, 4.0}; // std::array<double, 3>
// Behavior of unspecified elements is the same as with built-in arrays
[[maybe_unused]] std::array<int, 2> a5; // No list init, a5[0] and a5[1]
// are default initialized
[[maybe_unused]] std::array<int, 2> a6{}; // List init, both elements are value
// initialized, a6[0] = a6[1] = 0
[[maybe_unused]] std::array<int, 2> a7{1}; // List init, unspecified element is value
// initialized, a7[0] = 1, a7[1] = 0
}
Вывод:
3 2 1 E Ǝ
См. также
|
(C++26) | изменяемый массив с фиксированной ёмкостью, размещаемый непосредственно в памяти объекта (шаблон класса) |
| изменяемый непрерывный массив (шаблон класса) |
|
| двусторонняя очередь (шаблон класса) |
|
|
(Library Fundamentals TS v2) | создаёт объект std::array, размер и, при необходимости, тип элементов которого выводятся из аргументов (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/array