Sword STL之仿函数概念介绍
--介绍 函数和类似函数的对象(仿函数)遍布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; }