std::array
Определено в заголовочном файле <array> | ||
|---|---|---|
template<
class T,
std::size_t N
> struct array;
| (с C++11) |
std::array — это контейнер, который инкапсулирует массивы фиксированного размера.
Этот контейнер — агрегатный тип с теми же семантиками, что и структура, содержащая массив C-стиля T[N] в качестве единственного нестатического члена данных. В отличие от массива C-стиля, он не распадается до T* автоматически. Как агрегатный тип, он может быть инициализирован с помощью агрегатной инициализации, при этом количество инициализаторов, преобразуемых в T, не должно превышать N: 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 элементов одного типа.
Недействительность итераторов
Как правило, итераторы к массиву никогда не становятся недействительными на протяжении всего жизненного цикла массива. Однако следует учесть, что при обмене итератор по-прежнему будет указывать на тот же элемент массива и, таким образом, изменит его значение.
Шаблонные параметры
| T | - | тип элемента Должен быть MoveConstructible и MoveAssignable. |
| N | - | количество элементов в массиве или 0. |
Типы членов
| Тип члена | Определение | ||||||
|---|---|---|---|---|---|---|---|
value_type | T |
||||||
size_type | std::size_t |
||||||
difference_type | std::ptrdiff_t |
||||||
reference | value_type& |
||||||
const_reference | const value_type& | ||||||
pointer | value_type* |
||||||
const_pointer | const value_type* | ||||||
iterator |
|
||||||
const_iterator |
|
||||||
reverse_iterator | std::reverse_iterator<iterator> | ||||||
const_reverse_iterator | std::reverse_iterator<const_iterator> |
Члены-функции
Неявные члены функций |
|
| (конструктор)
(неявно объявлен) | инициализирует массив, следуя правилам инициализации агрегатов (обратите внимание, что неявная инициализация может привести к неопределённым значениям для не-классовых T) (публичный член-функция) |
| (деструктор)
(неявно объявлен) | уничтожает каждый элемент массива (публичный член-функция) |
| 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) | лексикографически сравнивает значения двух arrays (шаблон функции) |
|
(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 Ǝ
См. также
|
(основы библиотек TS v2) | создаёт объект std::array, размер и (необязательно) тип элементов которого выводятся из аргументов (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/array