引自 NM Jousttis 的“C++ 标准库”,第 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 类型的临时函数对象的 operator () 调用。实际元素作为参数传递。函数对象将其值 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
意思是为每次调用创建一个新的仿函数,还是每次调用都使用仿函数?