龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

STL组件之算法(1)(3)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
(3)绑定器函数对象 一个绑定器使用另一个函数对象f()和参数值V创建一个函数对象。被绑定函数对象必须为双目函数,也就是说有两个参数,A和B。STL 中

(3)绑定器函数对象

一个绑定器使用另一个函数对象f()和参数值V创建一个函数对象。被绑定函数对象必须为双目函数,也就是说有两个参数,A和B。STL 中的帮定器有:

  • bind1st() 创建一个函数对象,该函数对象将值V作为第一个参数A。
  • bind2nd()创建一个函数对象,该函数对象将值V作为第二个参数B。

举例如下:

Listing 11. binder.cpp

  1. #include <iostream.h>  
  2. #include <algorithm>  
  3. #include <functional>  
  4. #include <list>  
  5. using namespace std;  
  6. // Data  
  7. int iarray[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};  
  8. list<int> aList(iarray, iarray + 10);  
  9. int main()  
  10. {  
  11. int k = 0;  
  12. count_if(aList.begin(), aList.end(),  
  13. bind1st(greater<int>(), 8), k);  
  14. cout << "Number elements < 8 == " << k << endl;  
  15. return 0;  

Algorithm count_if()计算满足特定条件的元素的数目。 这是通过将一个函数对象和一个参数捆绑到为一个对象,并将该对象作为算法的第三个参数实现的。 注意这个表达式:

  1. bind1st(greater<int>(), 8) 

该表达式将greater<int>()和一个参数值8捆绑为一个函数对象。由于使用了bind1st(),所以该函数相当于计算下述表达式:

8 > q

表达式中的q是容器中的对象。因此,完整的表达式

  1. count_if(aList.begin(), aList.end(),  
  2. bind1st(greater<int>(), 8), k); 

计算所有小于或等于8的对象的数目。

(4)否定函数对象

所谓否定(negator)函数对象,就是它从另一个函数对象创建而来,如果原先的函数返回真,则否定函数对象返回假。有两个否定函数对象:not1()和 not2()。not1()接受单目函数对象,not2()接受双目函数对象。否定函数对象通常和帮定器一起使用。例如,上节中用bind1nd来搜索 q<=8的值:

  1. count_if(aList.begin(), aList.end(),  
  2. bind1st(greater<int>(), 8), k); 

如果要搜索q>8的对象,则用bind2st。而现在可以这样写:

  1. start = find_if(aList.begin(), aList.end(),  
  2. 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以模板为基础,所以能用于任何数据类型和结构。

精彩图集

赞助商链接