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; return 0; }
|