STL之仿函数实现详解

仿函数(functors,或名 function objects,函数对象),是 STL 六大组件(Components)的重要一环。

在STL的历史上,仿函数(functors)是早期的命名,C++ 标准定案后使用函数对象(function objects)的叫法。就实现意义而言, “函数对象”:一种具有函数性质的对象(本质为对象)。不过,就其行为而言,以及就中文用词的清晰漂亮和独特性而言,“仿函数”一次较为鲜明。

仿函数的应用场景主要在:作为算法组件中的相关函数接口的参数。更具体地说,STL 所提供的各种算法,往往有两个版本,其中一个版本表现出最常用(或最直观)的某种运算第二个版本则表现出最泛化的演算流程,允许用户“以 template 参数来指定所要采行的策略”。就拿accumulate()头文件)来说,其一般行为(第一个版本)是将指定范围内的所有元素相加,第二个版本则允许你指定某种“操作”(甚至是相乘),取代第一个版本中的“相加”行为。

用法一:

1
2
3
4
5
6
7
8
9
10
bool strLonger(const string& a, const string& b){
return a.size() < b.size();
}

void test_max(){
string a = "hello";
string b = "zoo";
cout<<max(a, b, strLonger)<<endl;
}

用法二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<typename T>
struct multiplier :public std::binary_function<T, T, T>
{
T operator() (const T& left, const T& right) const
{
return left*right;
}
}

int main(int, char**)
{
std::vector<int> v = {1, 2, 3, 4, 5};
std::cout << std::accumulate(v.begin(), v.end(), 1, multiplier<int>()) << std::endl;
// 1*1*2*3*4*5=120
return 0;
}