std::array
Определено в заголовочном файле <array> | ||
template< class T, | (начиная с C++11) | |
std::array
это контейнер, инкапсулирующий массив фиксированного размера.
Этот контейнер является агрегатным типом с той же семантикой, что и структура, содержащая массив в стиле CT[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 |
| ||||||
const_iterator |
| ||||||
reverse_iterator | std::reverse_iterator<iterator> | ||||||
const_reverse_iterator | std::reverse_iterator<const_iterator> |
[править]Функции-элементы
Неявно определённые функции-элементы | |
(конструктор) (объявлено неявно) | инициализирует массив в соответствии с правилами агрегатной инициализации (обратите внимание, что инициализация по умолчанию может привести к неопределённым значениям для неклассового T ) (public функция-элемент) |
(деструктор) (объявлено неявно) | уничтожает каждый элемент массива (public функция-элемент) |
operator= (объявлено неявно) | перезаписывает каждый элемент массива соответствующим элементом другого массива (public функция-элемент) |
Доступ к элементам | |
(C++11) | предоставляет доступ к указанному элементу с проверкой границ (public функция-элемент) |
(C++11) | предоставляет доступ к указанному элементу (public функция-элемент) |
(C++11) | предоставляет доступ к первому элементу (public функция-элемент) |
(C++11) | предоставляет доступ к последнему элементу (public функция-элемент) |
(C++11) | прямой доступ к базовому массиву (public функция-элемент) |
Итераторы | |
(C++11) | возвращает итератор на начало (public функция-элемент) |
(C++11) | возвращает итератор на конец (public функция-элемент) |
(C++11) | возвращает обратный итератор на начало (public функция-элемент) |
(C++11) | возвращает обратный итератор на конец (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 (шаблон функции) |
(C++11) | предоставляет доступ к элементу array (шаблон функции) |
(C++11) | специализация алгоритма std::swap (шаблон функции) |
(C++20) | создаёт объект std::array из встроенного массива (шаблон функции) |
[править]Вспомогательные классы
(C++11) | получает размер 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(constauto& 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, размер и, возможно, тип элемента выводится из аргументов (шаблон функции) |