cpp

Алгоритмы

В состав STL входят функции, позволяющие применять различные алгоритмы к элементам одного или нескольких контейнеров. Диапазон внутри контейнера задается с помощью двух итераторов: first и last. Итератор first указывает на первый элемент диапазона, а итератор last — на позицию после последнего элемента диапазона. Иными словами элемент с позицией last в диапазон не попадает. Обратите внимание: класс контейнера может быть произвольным, но он должен поддерживать требуемые операции с итераторами. Тип итератора можно узнать по прототипу в заголовочном файле. В целях экономии места, в книге вместо прототипов мы будем указывать только форматы функций без указания типов, а в примерах будем использовать контейнер vector, который поддерживает итераторы произвольного доступа.

Если в операции участвуют два контейнера, то диапазон внутри первого контейнера задается с помощью итераторов first1 и last1, а начало второго диапазона задается с помощью итератора first2. В этом случае количество элементов внутри двух диапазонов должно совпадать. Если второй диапазон задается с помощью двух итераторов, то количество элементов может быть разным. Некоторые функции записывают результат операции в другой контейнер. В этом случае начало диапазона с результатами задается с помощью итератора result.

Помимо реализованного функциями алгоритма в некоторых случаях существует возможность указать пользовательскую функцию, которая будет применена к элементам диапазона. В качестве значения можно передать указатель на функцию, функтор или лямбда-выражение. В примерах этой главы мы будем использовать лямбда-выражения.

Итак, давайте рассмотрим эти функции.

На заметку

Перебор элементов

Выполнить перебор элементов контейнера и применить к каждому элементу пользовательскую функцию позволяет функция for_each(). Прототип функции:

#include <algorithm>
template<typename _InputIterator, typename _Function>
   _Function for_each(_InputIterator first, _InputIterator last,
                      _Function f);

С помощью функции for_each() умножим значение каждого элемента массива на 2, а затем выведем все значения в окно консоли:

std::vector<int> arr = {1, 2, 3};
// Умножаем все элементы на 2
std::for_each( arr.begin(), arr.end(),
               [](int &a) { a *= 2; } );
// Выводим значения всех элементов
std::for_each( arr.begin(), arr.end(),
               [](int &a){ std::cout << a << ' '; } );
std::cout << std::endl; // 2 4 6

Аналогичную операцию можно выполнить с помощью цикла for each:

std::vector<int> arr = {1, 2, 3};
// Умножаем все элементы на 2
for (int &el : arr) {
   el *= 2;
}
// Выводим значения всех элементов
for (int &el : arr) std::cout << el << ' ';
std::cout << std::endl; // 2 4 6

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Реквизиты

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp