Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Списки инициализации
При инициализации массива мы указывали значения через запятую внутри фигурных скобок:
int arr[] = {10, 20, 30};
Такая конструкция называется списком инициализации. Этот список мы можем сохранить отдельно, используя шаблонный класс initializer_list
. Прежде чем использовать класс нужно подключить заголовочный файл initializer_list
:
#include <initializer_list>
При объявлении переменной указывается название класса, после которого внутри угловых скобок задается тип данных значений внутри списка инициализации:
std::initializer_list<int> list = {10, 20, 30};
Вместо названия класса можно указать ключевое слово auto
:
auto list = {10, 20, 30};
Класс initializer_list
содержит следующие методы:
size()
— возвращает количество значений внутри списка инициализации. Прототип метода:
constexpr size_type size() const noexcept;
typedef size_t size_type;
Пример:
std::initializer_list<int> list = {10, 20, 30};
std::cout << list.size() << std::endl; // 3
begin()
— возвращает константный итератор, установленный на первое значение внутри списка. Итератор — это объект, выполняющий в контейнере роль указателя. С помощью итератора можно перемещаться внутри контейнера и получать доступ к отдельным элементам. Прототип метода:
constexpr const_iterator begin() const noexcept;
typedef const E* const_iterator;
Выведем первое значение:
std::initializer_list<int> list = {10, 20, 30};
std::initializer_list<int>::const_iterator it = list.begin();
std::cout << *it << std::endl; // 10
Вместо метода begin()
можно воспользоваться шаблонной функцией begin()
:
std::initializer_list<int> list = {10, 20, 30};
std::initializer_list<int>::const_iterator it = std::begin(list);
std::cout << *it << std::endl; // 10
end()
— возвращает константный итератор, установленный на позицию после последнего значения списка. Прототип метода:
iterator end() noexcept;
const_iterator end() const noexcept;
Выведем последний элемент:
std::initializer_list<int> list = {10, 20, 30};
std::initializer_list<int>::const_iterator it = list.end();
std::cout << *(--it) << std::endl; // 30
Вместо метода end()
можно воспользоваться шаблонной функцией end()
:
std::initializer_list<int> list = {10, 20, 30};
std::initializer_list<int>::const_iterator it = std::end(list);
std::cout << *(--it) << std::endl; // 30
Начиная со стандарта C++14, доступны следующие функции:
rbegin()
— возвращает обратный итератор, установленный на последний элемент. Прототип функции:
template<typename _Tp>
reverse_iterator<const _Tp*> rbegin(initializer_list<_Tp> il);
Выведем значение последнего элемента:
std::initializer_list<int> list = {10, 20, 30};
auto it = std::rbegin(list);
std::cout << *it << std::endl; // 30
rend()
— возвращает обратный итератор, установленный на позицию перед первым элементом. Прототип функции:
template<typename _Tp>
reverse_iterator<const _Tp*> rend(initializer_list<_Tp> il);
Выведем значение первого элемента:
std::initializer_list<int> list = {10, 20, 30};
auto it = std::rend(list);
std::cout << *(--it) << std::endl; // 10
С итераторами можно производить такие же операции, как и с указателями. Чтобы получить значение, на которое ссылается итератор, перед названием переменной указывается оператор *
(*it
). Перемещение итератора осуществляется с помощью операторов +
, -
, ++
и --
. Кроме того, итераторы можно сравнивать с помощью операторов сравнения.
Пример перебора элементов списка с помощью итераторов и цикла for
:
std::initializer_list<int> list = {10, 20, 30};
for (auto it1 = list.begin(), it2 = list.end(); it1 != it2; ++it1) {
std::cout << *it1 << ' ';
} // 10 20 30
Пример использования цикла while
:
std::initializer_list<int> list = {10, 20, 30};
auto it1 = list.begin(), it2 = list.end();
while (it1 != it2) {
std::cout << *it1++ << ' ';
} // 10 20 30
Для перебора всех элементов списка очень удобно использовать цикл for each
:
std::initializer_list<int> list = {10, 20, 30};
for (auto &element : list) {
std::cout << element << ' ';
} // 10 20 30
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов