STL组件之算法(1)(3)
(3)绑定器函数对象
一个绑定器使用另一个函数对象f()和参数值V创建一个函数对象。被绑定函数对象必须为双目函数,也就是说有两个参数,A和B。STL 中的帮定器有:
- bind1st() 创建一个函数对象,该函数对象将值V作为第一个参数A。
- bind2nd()创建一个函数对象,该函数对象将值V作为第二个参数B。
举例如下:
Listing 11. binder.cpp
- #include <iostream.h>
- #include <algorithm>
- #include <functional>
- #include <list>
- using namespace std;
- // Data
- int iarray[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
- list<int> aList(iarray, iarray + 10);
- int main()
- {
- int k = 0;
- count_if(aList.begin(), aList.end(),
- bind1st(greater<int>(), 8), k);
- cout << "Number elements < 8 == " << k << endl;
- return 0;
- }
Algorithm count_if()计算满足特定条件的元素的数目。 这是通过将一个函数对象和一个参数捆绑到为一个对象,并将该对象作为算法的第三个参数实现的。 注意这个表达式:
- bind1st(greater<int>(), 8)
该表达式将greater<int>()和一个参数值8捆绑为一个函数对象。由于使用了bind1st(),所以该函数相当于计算下述表达式:
8 > q
表达式中的q是容器中的对象。因此,完整的表达式
- count_if(aList.begin(), aList.end(),
- bind1st(greater<int>(), 8), k);
计算所有小于或等于8的对象的数目。
(4)否定函数对象
所谓否定(negator)函数对象,就是它从另一个函数对象创建而来,如果原先的函数返回真,则否定函数对象返回假。有两个否定函数对象:not1()和 not2()。not1()接受单目函数对象,not2()接受双目函数对象。否定函数对象通常和帮定器一起使用。例如,上节中用bind1nd来搜索 q<=8的值:
- count_if(aList.begin(), aList.end(),
- bind1st(greater<int>(), 8), k);
如果要搜索q>8的对象,则用bind2st。而现在可以这样写:
- start = find_if(aList.begin(), aList.end(),
- not1(bind1nd(greater<int>(), 6)));
你必须使用not1,因为bind1nd返回单目函数。
总结:使用标准模板库 (STL)
尽管很多程序员仍然在使用标准C函数,但是这就好像骑着毛驴寻找Mercedes一样。你当然最终也会到达目标,但是你浪费了很多时间。
尽管有时候使用标准C函数确实方便(如使用sprintf()进行格式化输出)。但是C函数不使用异常机制来报告错误,也不适合处理新的数据类型。而且标准C函数经常使用内存分配技术,没有经验的程序员很容易写出bug来。.
C++标准库则提供了更为安全,更为灵活的数据集处理方式。STL最初由HP实验室的Alexander Stepanov和Meng Lee开发。最近,C++标准委员会采纳了STL,尽管在不同的实现之间仍有细节差别。
STL的最主要的两个特点:数据结构和算法的分离,非面向对象本质。访问对象是通过象指针一样的迭代器实现的;容器是象链表,矢量之类的数据结构,并按模板方式提供;算法是函数模板,用于操作容器中的数据。由于STL以模板为基础,所以能用于任何数据类型和结构。
- 上一篇:STL组件之迭代器(1)
- 下一篇:STL容器之向量vector容器