Пространства имён
Варианты
Действия

std::array

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

Содержание

[править] Аннулирование итератора

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

[править] Типы элементы

Тип элемент Определение
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

LegacyRandomAccessIterator и LegacyContiguousIterator в value_type

(до C++17)

LegacyRandomAccessIterator и LegacyContiguousIterator это LiteralType to value_type

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

LegacyRandomAccessIterator, contiguous_iterator и ConstexprIterator в value_type

(начиная с C++20)
[править]
const_iterator

LegacyContiguousIterator в const value_type

(до C++17)

LegacyRandomAccessIterator и LegacyContiguousIterator это LiteralType to const value_type

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

LegacyRandomAccessIterator, contiguous_iterator и ConstexprIterator в const value_type

(начиная с C++20)
[править]
reverse_iterator std::reverse_iterator<iterator>[править]
const_reverse_iterator std::reverse_iterator<const_iterator>[править]

[править] Функции-элементы

Неявно определённые функции-элементы
(конструктор)
(объявлено неявно)
инициализирует массив в соответствии с правилами агрегатной инициализации (обратите внимание, что инициализация по умолчанию может привести к неопределённым значениям для неклассового 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 функция-элемент) [править]

[править] Функции, не являющиеся элементами

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

[править] Вспомогательные классы

получает размер array
(специализация шаблона класса) [править]
получает тип элементов array
(специализация шаблона класса) [править]

Принципы вывода

(начиная с C++17)

[править] Пример

#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};
}

Вывод:

3 2 1 
E Ǝ

[править] Смотрите также

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