Spec-Zone.ru › C++

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

LegacyRandomAccessIterator и LegacyContiguousIterator для value_type

(до C++17)

LegacyRandomAccessIterator и LegacyContiguousIterator, являющийся LiteralType, для value_type

(начиная с C++17)
(до C++20)

LegacyRandomAccessIterator, contiguous_iterator и ConstexprIterator для value_type

(начиная с C++20)
const_iterator

LegacyRandomAccessIterator и LegacyContiguousIterator для constvalue_type

(до C++17)

LegacyRandomAccessIterator и LegacyContiguousIterator, являющийся LiteralType, для constvalue_type

(начиная с C++17)
(до C++20)

LegacyRandomAccessIterator, contiguous_iterator и ConstexprIterator для constvalue_type

(начиная с C++20)
reverse_iterator std::reverse_iterator<iterator>
const_reverse_iterator std::reverse_iterator<const_iterator>

Функции-члены

Неявно определённые функции-члены
(constructor)
(объявлен неявно)
инициализирует массив согласно правилам агрегатной инициализации (обратите внимание, что инициализация по умолчанию может привести к неопределённым значениям для неклассовых T)
(открытая функция-член)
(destructor)
(объявлен неявно)
уничтожает каждый элемент массива
(открытая функция-член)
operator=
(объявлен неявно)
заменяет каждый элемент массива соответствующим элементом другого массива
(открытая функция-член)
Доступ к элементам
at
доступ к указанному элементу с проверкой границ
(открытая функция-член)
operator[]
доступ к указанному элементу
(открытая функция-член)
front
доступ к первому элементу
(открытая функция-член)
back
доступ к последнему элементу
(открытая функция-член)
data
прямой доступ к базовому непрерывному хранилищу
(открытая функция-член)
Итераторы
begincbegin
возвращает итератор на начало
(открытая функция-член)
endcend
возвращает итератор на конец
(открытая функция-член)
rbegincrbegin
возвращает обратный итератор на начало
(открытая функция-член)
rendcrend
возвращает обратный итератор на конец
(открытая функция-член)
Ёмкость
empty
проверяет, пуст ли контейнер
(открытая функция-член)
size
возвращает количество элементов
(открытая функция-член)
max_size
возвращает максимально возможное количество элементов
(открытая функция-член)
Операции
fill
заполняет контейнер указанным значением
(открытая функция-член)
swap
обменивает содержимое
(открытая функция-член)

Функции, не являющиеся членами

operator==operator!=operator<operator<=operator>operator>=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
(шаблон функции)
get(std::array)
(C++11)
получает доступ к элементу array
(шаблон функции)
std::swap(std::array)
(C++11)
специализирует алгоритм std::swap
(шаблон функции)
to_array
(C++20)
создаёт объект std::array из встроенного массива
(шаблон функции)

Вспомогательные классы

std::tuple_size<std::array>
(C++11)
получает размер array
(специализация шаблона класса)
std::tuple_element<std::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 Ǝ

См. также

inplace_vector
(C++26)
изменяемый массив с фиксированной ёмкостью, размещаемый непосредственно в памяти объекта
(шаблон класса)
vector
изменяемый непрерывный массив
(шаблон класса)
deque
двусторонняя очередь
(шаблон класса)
make_array
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API