-- 介绍
函数和类似函数的对象 (仿函数) 遍布 STL. 关联容器使用它们来使元素保持有序; find_if 这样的算法使用它们来控制它们的行为;
如果缺少它们, 那么比如 for_each 和 transform 这样的组件就没有意义了; 比如 not1 和 bind2nd 这样的适配器会积极地产生它们.
-- 定义
仿函数 (functor) 就是一个重载了 "()" 运算符的 struct 或 class(基本上使用 struct), 利用对象支持 operator()的特性, 来达到模拟函数调用效果的技术.
仿函数的相应型别主要用来表现函数参数型别和传回值型别. 为了方便起见,<functional > 定义了两个基类, 分别代表一元仿函数 (unary_function) 和二元
仿函数 (binary_function)(STL 不支持三元仿函数) 当然我们也可以不继承这两个基类, 只要实现 "()" 运算符重载即可
-- 详解
STL 函数对象在函数指针之后成型, 所以 STL 中的习惯是当传给函数和从函数返回时函数对象也是值传递的(也就是拷贝),
函数对象的值拷贝暗含以下两个要求:
第一, 你的函数对象应该很小. 否则它们的拷贝会很昂贵.
第二, 你的函数对象必须单态(也就是, 非多态, 纯函数)-- 它们不能用虚函数. 那是因为派生类对象以值传递代入基类类型的参数会造成切割问题, 在拷贝时, 它们的派生部分被删除.
纯函数的定义
纯函数是返回值只依赖于参数的函数. 如果 f 是一个纯函数, x 和 y 是对象, f(x, y)的返回值仅当 x 或 y 的 值改变的时候才会改变.
在 C++ 中, 由纯函数引用的所有数据不是作为参数传进的就是在函数生存期内是常量.(一般, 这样的常量应该声明为 const.)
- // 非纯函数例子
- int func1(int x)
- {
- /*
- 这并非一个纯函数, 因为有 a 这个静态变量, 每一次调用 func1,a 的值都会发生变化
- 即使每次 x 是相同的, 但是返回值是不同的
- */
- static int a = 1;
- a++;
- return x + a;
- }
来源: http://www.bubuko.com/infodetail-2828097.html