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

std::array

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

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

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

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

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