std::for_each
Материал из cppreference.com
Определено в заголовочном файле <algorithm> | ||
template<class InputIt, class UnaryFunction > UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f ); | ||
По порядку применяет заданный функциональный объект f
к результату разыменования каждого итератора в диапазоне [first, last)
. Если InputIt
— изменяемый итератор, то f
может изменять элементы диапазона через разыменованный итератор. Если f
возвращает результат, то он игнорируется.
Содержание |
[править]Параметры
[ first, last) | — | два итератора задающих диапазон элементов для применения функции |
f | — | применяемый унарный функциональный объект |
Требования к типам | ||
-InputIt должен соответствовать требованиям InputIterator . | ||
-UnaryFunction должен соответствовать требованиям MoveConstructible . Не обязательно CopyConstructible |
[править]Возвращаемое значение
f . | (до C++11) |
std::move(f). | (начиная с C++11) |
[править]Сложность
Ровно last
- first
применений f
.
[править]Возможная реализация
template<class InputIt, class UnaryFunction> UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f){for(; first != last;++first){ f(*first);}return f;} |
[править]Пример
В следующем примере используется лямбда-функция для инкрементации всех элементов вектора, а затем считается их сумма:
Запустить этот код
#include <vector>#include <algorithm>#include <iostream> struct Sum { Sum(){ sum =0;}void operator()(int n){ sum += n;} int sum;}; int main(){std::vector<int> nums{3, 4, 2, 9, 15, 267}; std::cout<<"до: ";for(auto n : nums){std::cout<< n <<" ";}std::cout<<'\n'; std::for_each(nums.begin(), nums.end(), [](int&n){ n++;}); Sum s = std::for_each(nums.begin(), nums.end(), Sum()); std::cout<<"после: ";for(auto n : nums){std::cout<< n <<" ";}std::cout<<'\n';std::cout<<"сумма: "<< s.sum<<'\n';}
Вывод:
до: 3 4 2 9 15 267 после: 4 5 3 10 16 268 сумма: 306
[править]См. также
применяет функцию к диапазону элементов, сохраняя результаты в целевом диапазоне (шаблон функции) | |
диапазонный цикл for (C++11) | выполняет цикл по диапазону |