仿函数

<STL源码剖析>阅读笔记之 仿函数和适配器

跟風遠走 提交于 2020-02-04 05:48:07
仿函数(函数对象)和适配器可以说是STL中默默无闻的贡献者,它们没有容器、算法和迭代器那么有名 但是其贡献却很大。这里总结的主要是书中第7、8章的内容。 一 仿函数 仿函数又称函数对象,从名字上可以得出,它本质上是 一种具有函数特质的对象 , 也即可以像使用函 数 一样使用该对象。怎么样做?重载operator()运算符即可,有了这个运算符,我们就可以在仿函数对象后 面加上一对小括号,以此调用仿函数所定义的operator()。STL仿函数可以分为一元和二元,或者算术运 算、关系运算和逻辑运算。 为什么要有仿函数?在算法的设计过程中,我们会发现其本质往往是不变的(例如排序算法的思想),变 化的除了数据之外还有操作(例如排序中不一定是比较大小,也可以是两两之间满足某种关系),仿函数就 是为了这种情况产生的,它替代原来需要函数指针的地方,把这种操作或者策略传给算法,使得算法抽象性 更高,也就更通用。 为什么不用函数指针?很简单的解释是抽象性不够,更进一步说是它无法配接,也就是可以将操 作配接在 一起变换为更复杂的操作(例如compose和bind1st等等方法),仿函数则可以轻松实现这些配接, 使得其功 能异常强大。 仿函数在实现上是一个结构体,并且如上所述重载了operator()运算符,所有的仿函数如果是一元的都继 承自unary_function,二元则继承自binary

从for_each开始说起 回调函数与仿函数

廉价感情. 提交于 2020-01-07 16:26:45
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> #include <iostream> #include <algorithm> using namespace std; //回调函数 void call_back(char elem) { cout << elem << endl; } //仿函数 struct Functor { void operator() (char elem) { cout << elem << endl; } }; int main() { string strA = "hello"; string strB = "world"; for_each(strA.begin(),strA.end(),Functor()); cout<<"===========GAP==============="<<endl; for_each(strB.begin(),strB.end(),call_back); getchar(); return 0; } h e l l o ===========GAP=============== w o r l d 可能会有疑问两者有什么区别? 假如我要for_each遍历的不是字符串而是int类型的vector呢? 是不是又要重写一个int类型作为参数的回调函数