函数模板
<algorithm>

std::for_each

template <class InputIterator, class Function>   Function for_each (InputIterator first, InputIterator last, Function fn);
将函数应用于范围
将函数 fn 应用于范围 [first,last) 中的每个元素。

此模板函数的行为等效于
1
2
3
4
5
6
7
8
9
template<class InputIterator, class Function>
  Function for_each(InputIterator first, InputIterator last, Function fn)
{
  while (first!=last) {
    fn (*first);
    ++first;
  }
  return fn;      // or, since C++11: return move(fn);
}

参数

first, last
输入迭代器 到序列的起始和结束位置。使用的范围是 [first,last),它包含 first 和 last 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
fn
一元函数,接受范围中的元素作为参数。
这可以是指针函数或 可移动构造 的函数对象。
它的返回值(如果有)将被忽略。

返回值

返回 fn
返回 fn,如同调用 std::move(fn)

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// for_each example
#include <iostream>     // std::cout
#include <algorithm>    // std::for_each
#include <vector>       // std::vector

void myfunction (int i) {  // function:
  std::cout << ' ' << i;
}

struct myclass {           // function object type:
  void operator() (int i) {std::cout << ' ' << i;}
} myobject;

int main () {
  std::vector<int> myvector;
  myvector.push_back(10);
  myvector.push_back(20);
  myvector.push_back(30);

  std::cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myfunction);
  std::cout << '\n';

  // or:
  std::cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myobject);
  std::cout << '\n';

  return 0;
}

输出
myvector contains: 10 20 30
myvector contains: 10 20 30


复杂度

线性于 firstlast 之间的 距离:将 fn 应用于每个元素。

数据竞争

范围 [first,last) 中的对象将被访问(每个对象恰好访问一次)。
如果 InputIterator可变迭代器类型且 fn 不是常量函数,则可以修改这些对象。

异常

如果 fn 引发异常,或者迭代器上的任何操作引发异常,则抛出异常。
请注意,无效参数会导致未定义行为

另见