Array
Контейнер array представляет аналог массива. Он также имеет фиксированный размер.
Для создания объекта array в угловых скобках после названия типа необходимо передать его тип и размер:
1
2
std::array<int, 6> numbers; // состоит из 6 чисел
std::array<std::string, 5> strings; // состоит из 5 строк
Фиксированный размер накладывает ограничение на инициализацию и использование подобных контейнеров. В частности, для инициализации мы не можем использовать стандартные для большинства контейнеров конструкторы. А при списочной инициализации количество передаваемых контейнеру элементов не должно превышать его размер:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <array>
#include <string>
int main()
{
std::array<int, 6> numbers = { 1, 2, 3, 4, 5, 6 };
std::array<std::string, 5> names = { "Tom", "Alice", "Kate", "Bob", "Sam" };
for (auto n : numbers)
{
std::cout << n << "\t";
}
std::cout << std::endl;
return 0;
}
Если при инициализации мы передадим меньшее количество элементов, то для недостающих элементов будут использоваться значения по умолчанию (например, для целочисленных типов это число 0). Однако если при инициализации мы предадим большее количество элементов, нежели размер контейнера, то мы столкнемся с ошибкой.
В контейнер array нельзя добавлять новые элементы, так же как и удалять уже имеющиеся. Основные функции типа array, которые мы можем использовать:
size(): возвращает размер контейнера
at(index): возвращает элемент по индексу index
front(): возвращает первый элемент
back(): возвращает последний элемент
fill(n): присваивает всем элементам контейнера значение n
Применение методов:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <array>
#include <string>
int main()
{
std::array<std::string, 5> names = { "Tom", "Alice", "Kate", "Bob", "Sam" };
std::string third = names.at(2); // Kate
std::string first = names.front(); // Tom
std::string last = names.back(); // Sam
std::cout << third << std::endl;
std::cout << first << std::endl;
std::cout << last << std::endl;
names.fill("Tim"); // names = { "Tim", "Tim", "Tim", "Tim", "Tim" }
for (int i = 0; i<names.size(); i++)
{
std::cout << names[i] << std::endl;
}
return 0;
}
Несмотря на то, что объекты array похожи на обычные массивы, однако тип array более гибок. Например, мы не можем присваивать одному массиву напрямую значения второго массива. В то же время объекту array мы можем передавать данные другого объекта array:
1
2
3
4
5
std::array<int, 5> numbers1 = { 1, 2, 3, 4, 5 };
std::array<int, 5> numbers2 = numbers1; // так можно сделать
int nums1[] = { 1,2,3,4,5 };
//int nums2[] = nums1; // так нельзя следать