std::for_each
来源:互联网 发布:太原知达常青藤好进吗 编辑:程序博客网 时间:2024/04/30 13:51
std::for_each
1) Applies the given function object f
to the result of dereferencing every iterator in the range [first, last)
, in order.2) Applies the given function object f
to the result of dereferencing every iterator in the range [first, last)
(not necessarily in order). The algorithm is executed according to policy
. This overload does not participate in overload resolution unless std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> is true.For both overloads, if InputIt
is a mutable iterator, f
may modify the elements of the range through the dereferenced iterator. If f
returns a result, the result is ignored.
Parameters
first, last-the range to apply the function topolicy-the execution policy to use. See execution policy for details.f-function object, to be applied to the result of dereferencing every iterator in the range [first, last)
The signature of the function should be equivalent to the following:
void fun(const Type &a);
The signature does not need to have const &.
The type Type must be such that an object of type InputIt can be dereferenced and then implicitly converted to Type.
Type requirements-InputIt
must meet the requirements of InputIterator
.-UnaryFunction
must meet the requirements of MoveConstructible
. Does not have to be CopyConstructible
-UnaryFunction2
must meet the requirements of CopyConstructible
.Return value
1) f
(until C++11) std::move(f) (since C++11)2) (nothing)Complexity
Exactly last
- first
applications of f
Exceptions
The overload with a template parameter named ExecutionPolicy
reports errors as follows:
- If execution of a function invoked as part of the algorithm throws an exception,
- if
policy
is std::parallel_vector_execution_policy, std::terminate is called - if
policy
is std::sequential_execution_policy or std::parallel_execution_policy, the algorithm exits with an std::exception_list containing all uncaught exceptions. If there was only one uncaught exception, the algorithm may rethrow it without wrapping in std::exception_list. It is unspecified how much work the algorithm will perform before returning after the first exception was encountered. - if
policy
is some other type, the behavior is implementation-defined
- If the algorithm fails to allocate memory (either for itself or to construct an std::exception_list when handling a user exception), std::bad_alloc is thrown.
Possible implementation
template<class InputIt, class UnaryFunction>UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f){ for (; first != last; ++first) { f(*first); } return f;}
Example
The following example uses a lambda function to increment all of the elements of a vector and then uses an overloaded operator()
in a functor to compute their sum:
Run this code#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, 8, 15, 267}; std::cout << "before:"; for (auto const &n : nums) { std::cout << ' ' << n; } std::cout << '\n'; std::for_each(nums.begin(), nums.end(), [](int &n){ n++; }); // calls Sum::operator() for each number Sum s = std::for_each(nums.begin(), nums.end(), Sum()); std::cout << "after: "; for (auto const &n : nums) { std::cout << ' ' << n; } std::cout << '\n'; std::cout << "sum: " << s.sum << '\n';}
Output:
before: 3 4 2 8 15 267after: 4 5 3 9 16 268sum: 305
f
to the result of dereferencing every iterator in the range [first, last)
, in order.f
to the result of dereferencing every iterator in the range [first, last)
(not necessarily in order). The algorithm is executed according to policy
. This overload does not participate in overload resolution unless std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> is true.For both overloads, if InputIt
is a mutable iterator, f
may modify the elements of the range through the dereferenced iterator. If f
returns a result, the result is ignored.
Parameters
first, last-the range to apply the function topolicy-the execution policy to use. See execution policy for details.f-function object, to be applied to the result of dereferencing every iterator in the range[first, last)
The signature of the function should be equivalent to the following:
void fun(const Type &a);
The signature does not need to have const &.
The type Type must be such that an object of type InputIt can be dereferenced and then implicitly converted to Type.
Type requirements-InputIt
must meet the requirements of InputIterator
.-UnaryFunction
must meet the requirements of MoveConstructible
. Does not have to be CopyConstructible
-UnaryFunction2
must meet the requirements of CopyConstructible
.Return value
f
(until C++11) std::move(f) (since C++11)Complexity
Exactly last
- first
applications of f
Exceptions
The overload with a template parameter named ExecutionPolicy
reports errors as follows:
- If execution of a function invoked as part of the algorithm throws an exception,
- if
policy
is std::parallel_vector_execution_policy, std::terminate is called - if
policy
is std::sequential_execution_policy or std::parallel_execution_policy, the algorithm exits with an std::exception_list containing all uncaught exceptions. If there was only one uncaught exception, the algorithm may rethrow it without wrapping in std::exception_list. It is unspecified how much work the algorithm will perform before returning after the first exception was encountered. - if
policy
is some other type, the behavior is implementation-defined
- if
- If the algorithm fails to allocate memory (either for itself or to construct an std::exception_list when handling a user exception), std::bad_alloc is thrown.
Possible implementation
template<class InputIt, class UnaryFunction>UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f){ for (; first != last; ++first) { f(*first); } return f;}
Example
The following example uses a lambda function to increment all of the elements of a vector and then uses an overloaded operator()
in a functor to compute their sum:
#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, 8, 15, 267}; std::cout << "before:"; for (auto const &n : nums) { std::cout << ' ' << n; } std::cout << '\n'; std::for_each(nums.begin(), nums.end(), [](int &n){ n++; }); // calls Sum::operator() for each number Sum s = std::for_each(nums.begin(), nums.end(), Sum()); std::cout << "after: "; for (auto const &n : nums) { std::cout << ' ' << n; } std::cout << '\n'; std::cout << "sum: " << s.sum << '\n';}
Output:
before: 3 4 2 8 15 267after: 4 5 3 9 16 268sum: 305
- std::for_each
- std::for_each
- C++ std::for_each
- 代码片段----std::for_each
- std::for_each()的奇怪现象
- 利用std::for_each 定义宏函数
- C++中std::for_each的使用
- std::stable_sort 和 std::for_each 的用法[转]
- for_each
- for_each
- for_each
- for_each
- for_each
- for_each
- for_each
- for_each
- for_each
- for_each
- ios 滑动返回 pop
- hdoj2011 (java)多项式求和
- 《CSS3实战》笔记--渐变设计(一)
- c++的灵魂,类的书写的一些看法
- 谈谈低延迟对音质的负面影响,顺便谈谈WASAPI
- std::for_each
- Android getWidth和getMeasuredWidth 区别
- Taglist: Exuberant ctags (http://ctags.sf.net) not found in PATH. Plugin is not loaded.
- listView设置条目分隔线
- 布局参数
- LeetCode 24. Swap Nodes in Pairs
- 大数据时代的技术hive:hive介绍
- for语句
- mesos 0.25.0/0.28.0 集群部署升级指南