Класс initializer_list
Класс initializer_list представляет собой
легковесную обёртку над массивом объектов типа T,
который автоматически создаётся компилятором при
использовании списка инициализации в фигурных скобках.
Он позволяет функциям и конструкторам принимать
произвольное количество аргументов одного типа.
Класс хранит указатель на первый элемент и размер
списка, при этом сами элементы являются константными
и не могут быть изменены через объект initializer_list.
Объекты initializer_list обычно используются
для инициализации контейнеров стандартной библиотеки,
таких как vector, list или map,
а также для передачи переменного числа аргументов
в функции. Время жизни такого объекта совпадает
со временем жизни выражения, в котором он был создан.
Синтаксис
#include <initializer_list>
std::initializer_list<T> il = {значение1, значение2, ...};
Основные методы класса:
il.begin() // итератор на первый элемент
il.end() // итератор на элемент после последнего
il.size() // количество элементов в списке
Пример
Давайте создадим объект initializer_list
из нескольких целых чисел и выведем его элементы
и размер на экран:
#include <iostream>
#include <initializer_list>
using namespace std;
int main()
{
initializer_list<int> il = {1, 2, 3, 4, 5};
for (int elem : il) {
cout << elem << " ";
}
cout << endl;
cout << il.size() << endl;
return 0;
}
Результат выполнения кода:
1 2 3 4 5
5
Пример
Давайте напишем функцию, которая принимает
initializer_list и возвращает сумму всех
её элементов:
#include <iostream>
#include <initializer_list>
using namespace std;
int sum(initializer_list<int> il)
{
int res = 0;
for (int elem : il) {
res += elem;
}
return res;
}
int main()
{
cout << sum({1, 2, 3, 4, 5}) << endl;
cout << sum({10, 20, 30}) << endl;
return 0;
}
Результат выполнения кода:
15
60
Пример
Давайте используем initializer_list
для инициализации вектора строками:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> vec = {"a", "b", "c", "d", "e"};
for (const string& elem : vec) {
cout << elem << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
"a b c d e"
Пример
Давайте получим итераторы на начало и конец
списка с помощью методов begin и
end и пройдёмся по элементам:
#include <iostream>
#include <initializer_list>
using namespace std;
int main()
{
initializer_list<int> il = {1, 2, 3, 4, 5};
for (auto it = il.begin(); it != il.end(); ++it) {
cout << *it << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
1 2 3 4 5