C++
станд :: массив
Поиск…
параметры
параметр | Определение |
---|---|
class T | Задает тип данных элементов массива |
std::size_t N | Указывает количество элементов в массиве |
замечания
Использование std::array
требует включения заголовка <array>
с помощью #include <array>
.
Инициализация std :: array
Инициализация std::array<T, N>
, где T
- скалярный тип, а N
- число элементов типа T
Если T
является скалярным типом, std::array
может быть инициализирован следующими способами:
// 1) Using aggregate-initialization
std::array<int, 3> a{ 0, 1, 2 };
// or equivalently
std::array<int, 3> a = { 0, 1, 2 };
// 2) Using the copy constructor
std::array<int, 3> a{ 0, 1, 2 };
std::array<int, 3> a2(a);
// or equivalently
std::array<int, 3> a2 = a;
// 3) Using the move constructor
std::array<int, 3> a = std::array<int, 3>{ 0, 1, 2 };
Инициализация std::array<T, N>
, где T
- нескалярный тип, а N
- число элементов типа T
Если T
- нескалярный тип, std::array
может быть инициализирован следующими способами:
struct A { int values[3]; }; // An aggregate type
// 1) Using aggregate initialization with brace elision
// It works only if T is an aggregate type!
std::array<A, 2> a{ 0, 1, 2, 3, 4, 5 };
// or equivalently
std::array<A, 2> a = { 0, 1, 2, 3, 4, 5 };
// 2) Using aggregate initialization with brace initialization of sub-elements
std::array<A, 2> a{ A{ 0, 1, 2 }, A{ 3, 4, 5 } };
// or equivalently
std::array<A, 2> a = { A{ 0, 1, 2 }, A{ 3, 4, 5 } };
// 3)
std::array<A, 2> a{{ { 0, 1, 2 }, { 3, 4, 5 } }};
// or equivalently
std::array<A, 2> a = {{ { 0, 1, 2 }, { 3, 4, 5 } }};
// 4) Using the copy constructor
std::array<A, 2> a{ 1, 2, 3 };
std::array<A, 2> a2(a);
// or equivalently
std::array<A, 2> a2 = a;
// 5) Using the move constructor
std::array<A, 2> a = std::array<A, 2>{ 0, 1, 2, 3, 4, 5 };
Доступ к элементу
1. at(pos)
Возвращает ссылку на элемент в позиции pos
с проверкой границ. Если pos
не находится в пределах контейнера, std::out_of_range
исключение типа std::out_of_range
.
Сложность постоянна O (1).
#include <array>
int main()
{
std::array<int, 3> arr;
// write values
arr.at(0) = 2;
arr.at(1) = 4;
arr.at(2) = 6;
// read values
int a = arr.at(0); // a is now 2
int b = arr.at(1); // b is now 4
int c = arr.at(2); // c is now 6
return 0;
}
2) operator[pos]
Возвращает ссылку на элемент в позиции pos
без проверки границ. Если pos
не находится в пределах контейнера, может произойти ошибка нарушения сегментации во время выполнения. Этот метод обеспечивает доступ к элементу, эквивалентный классическим массивам и более эффективному, чем at(pos)
.
Сложность постоянна O (1).
#include <array>
int main()
{
std::array<int, 3> arr;
// write values
arr[0] = 2;
arr[1] = 4;
arr[2] = 6;
// read values
int a = arr[0]; // a is now 2
int b = arr[1]; // b is now 4
int c = arr[2]; // c is now 6
return 0;
}
3) std::get<pos>
Эта функция не являющийся членом возвращает ссылку на элемент во время компиляции постоянной позиции pos
без проверки границ. Если pos
не находится в пределах контейнера, может произойти ошибка нарушения сегментации во время выполнения.
Сложность постоянна O (1).
#include <array>
int main()
{
std::array<int, 3> arr;
// write values
std::get<0>(arr) = 2;
std::get<1>(arr) = 4;
std::get<2>(arr) = 6;
// read values
int a = std::get<0>(arr); // a is now 2
int b = std::get<1>(arr); // b is now 4
int c = std::get<2>(arr); // c is now 6
return 0;
}
4) front()
Возвращает ссылку на первый элемент в контейнере. Вызов front()
на пустой контейнер не определен.
Сложность постоянна O (1).
Примечание. Для контейнера c выражение c.front()
эквивалентно *c.begin()
.
#include <array>
int main()
{
std::array<int, 3> arr{ 2, 4, 6 };
int a = arr.front(); // a is now 2
return 0;
}
5) back()
Возвращает ссылку на последний элемент в контейнере. Вызов back()
на пустой контейнер не определен.
Сложность постоянна O (1).
#include <array>
int main()
{
std::array<int, 3> arr{ 2, 4, 6 };
int a = arr.back(); // a is now 6
return 0;
}
6) data()
Возвращает указатель на базовый массив, служащий в качестве хранилища элементов. Указатель таков, что range [data(); data() + size())
всегда является допустимым диапазоном, даже если контейнер пуст ( data()
не вызывает различий в этом случае).
Сложность постоянна O (1).
#include <iostream>
#include <cstring>
#include <array>
int main ()
{
const char* cstr = "Test string";
std::array<char, 12> arr;
std::memcpy(arr.data(), cstr, 12); // copy cstr to arr
std::cout << arr.data(); // outputs: Test string
return 0;
}
Проверка размера массива
Одним из основных преимуществ std::array
по сравнению с массивом стиля C
является то, что мы можем проверить размер массива с помощью функции члена size()
int main() {
std::array<int, 3> arr = { 1, 2, 3 };
cout << arr.size() << endl;
}
Итерирование через массив
std::array
являющийся контейнером STL, может использовать диапазон для цикла, аналогичный другим контейнерам, таким как vector
int main() {
std::array<int, 3> arr = { 1, 2, 3 };
for (auto i : arr)
cout << i << '\n';
}
Одновременное изменение всех элементов массива
Функция member fill()
может использоваться в std::array
для изменения значений сразу после инициализации
int main() {
std::array<int, 3> arr = { 1, 2, 3 };
// change all elements of the array to 100
arr.fill(100);
}