◐ Shell
clean mode source ↗

std::array — cppreference.com

Материал из cppreference.com

<tbody> </tbody>

Определено в заголовочном файле <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 элементов одного типа.

Аннулирование итератора

Как правило, итераторы массива никогда не становятся недействительными в течение всего времени существования массива. Однако следует отметить, что во время обмена итератор будет продолжать указывать на тот же элемент массива и, таким образом, будет изменять его значение.

Типы элементы

Функции-элементы

Неявно определённые функции-элементы

(конструктор)

(объявлено неявно)

инициализирует массив в соответствии с правилами агрегатной инициализации (обратите внимание, что инициализация по умолчанию может привести к неопределённым значениям для неклассового T)
(public функция-элемент)

(деструктор)

(объявлено неявно)

уничтожает каждый элемент массива
(public функция-элемент)

operator=

(объявлено неявно)

перезаписывает каждый элемент массива соответствующим элементом другого массива
(public функция-элемент)
Доступ к элементам

(C++11)

предоставляет доступ к указанному элементу с проверкой границ
(public функция-элемент) [править]
предоставляет доступ к указанному элементу
(public функция-элемент) [править]

(C++11)

предоставляет доступ к первому элементу
(public функция-элемент) [править]

(C++11)

предоставляет доступ к последнему элементу
(public функция-элемент) [править]

(C++11)

прямой доступ к базовому массиву
(public функция-элемент) [править]
Итераторы
возвращает итератор на начало
(public функция-элемент) [править]

(C++11)

возвращает итератор на конец
(public функция-элемент) [править]
возвращает обратный итератор на начало
(public функция-элемент) [править]
возвращает обратный итератор на конец
(public функция-элемент) [править]
Ёмкость

(C++11)

проверяет, пуст ли контейнер
(public функция-элемент) [править]

(C++11)

возвращает количество элементов
(public функция-элемент) [править]

(C++11)

возвращает максимально возможное количество элементов
(public функция-элемент) [править]
Операции

(C++11)

заполняет контейнер указанным значением
(public функция-элемент) [править]

(C++11)

обменивает содержимое
(public функция-элемент) [править]

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

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

Пример

#include <string>
#include <iterator>
#include <iostream>
#include <algorithm>
#include <array>

int main()
{
    // Создание с использованием агрегатной инициализации
    std::array<int, 3> a1{ {1, 2, 3} }; // двойные фигурные скобки необходимы C++11 до
                                        // версии CWG 1270 (не требуются в C++11
                                        // после этой версии и в C++14 и последующих
                                        // версиях)

    std::array<int, 3> a2 = {1, 2, 3};  // двойные скобки никогда не требуются после =

    // Поддерживаются контейнерные операции
    std::sort(a1.begin(), a1.end());
    std::ranges::reverse_copy(a2, std::ostream_iterator<int>(std::cout, " "));

    std::cout << '\n';
    
    // Поддерживается диапазонный цикл for
    std::array<std::string, 2> a3 = { std::string("E"), "\u018E" };
    for(const auto& s: a3)
        std::cout << s << ' ';

    // Правила вывода для создания массива (начиная с C++17)
    [[maybe_unused]] std::array a4{3.0, 1.0, 4.0};  // -> std::array<double, 3>

    // Поведение неуказанных элементов такое же, как и у встроенных массивов
    // нет инициализации списком, a5[0] и a5[1] инициализируются по умолчанию
    [[maybe_unused]] std::array<int, 2> a5;
    // инициализация списком, оба элемента инициализируются значением, a6[0] = a6[1] = 0
    [[maybe_unused]] std::array<int, 2> a6{};
    // инициализация списком, неуказанный элемент инициализируется значением,
    // a7[0] = 1, a7[1] = 0
    [[maybe_unused]] std::array<int, 2> a7{1};
}

Вывод:

Смотрите также

создаёт объект std::array, размер и, возможно, тип элемента выводится из аргументов
(шаблон функции) [править]