函数对象实质上是一个实现了operator()--括号操作符重载--的类
// c++_1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
//累加器
template <typename T>
class Accumulater
{
private:
int *_count;
T *_total;
public:
Accumulater(int *count, T *total)
{
_count = count;
_total = total;
}
void operator()(T i)
{
(*_count)++;
(*_total) += i;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> record1;
for (int i = 0; i < 100; i++)
{
record1.push_back(i + 1);
}
int count = 0;
int total = 0;
Accumulater<int> sum(&count, &total);
for_each(record1.begin(), record1.end(), sum);
cout << "统计了" << count <<"个数,总和为: " <<total<<endl;
//数组
int records2[100];
for (int i = 0; i < 100; ++i)
{
records2[i] = i+1;
}
count = 0;
total = 0;
for_each(records2, records2 + 100, sum);
cout << "统计了" << count <<"个数,总和为: " <<total<<endl;
system("pause");
return 0;
}
结果如下:
函数对象类必须重载operator()函数,函数对象完全可以用函数来代替:
template <typename T>
void printRecord(T i)
{
cout << i << " ";
}
原函数对象为:
template <typename T>
class RecordPrinter
{
public:
void operator()(T i)
{
cout << i << " ";
}
};
for_each(records.begin(), records.end(), RecordPrinter<double>());