引用N M Jousttis的“The C++ Standard Library”第5.9节
#include < iostream>
#include < list>
#include < algorithm>
using namespace std;
//function object that adds the value with which it is initialized
class AddValue {
private:
int the Value; //the value to add
public:
//constructor initializes the value to add
AddValue(int v) : theValue(v) { }
//the "function call" for the element adds the value
void operator() (int& elem) const { elem += theValue; }
};
int main()
{
list<int> coll;
for (int i=1; i<=9; ++i)
coll.push_back(i);
//The first call of for_each() adds 10 to each value:
for_each (coll.begin(), coll.end(), AddValue(10)) ;
在这里,表达式AddValue(10)创建一个AddValue类型的对象,该对象使用
值10。AddValue的构造函数将此值存储为theValue成员。内
for_each(),为coll的每个元素调用“()”。同样,这是操作符()的调用
传递的AddValue类型的临时函数对象。实际元素作为
论据。函数对象将其值10添加到每个元素。元素然后具有
以下值:
加10之后:
11 12 13 14 15 16 17 18 19
for_each()的第二次调用使用相同的功能来添加第一个元素的值
每个元素。它使用第一个元素初始化AddValue类型的临时函数对象
的集合:
for_each (coll.begin(), coll.end(), AddValue (*coll. begin()) ) ;
添加第一个元素后,输出如下:
22 23 24 25 26 27 28 29 30
我不明白的是在第二种情况下为什么输出不
22 34 35 36 37 38 39 40 41
含义是为每个 call 创建一个新的函子,还是为每个 call 使用该函子?
最佳答案
表达式AddValue(*coll. begin())
创建一个类AddValue
的临时对象。然后将该临时变量传递给for_each
函数。然后for_each
对对象的函数调用运算符-operator()
进行调用(从coll.begin()
到coll.end()
的每个元素一次)。
从技术上讲,for_each
通过值(而不是引用)获取functor参数,因此,它实际上是在临时副本而非临时本身的副本上进行操作。