STL之函数对象

来源:互联网 发布:网址导航手机版源码 编辑:程序博客网 时间:2024/04/25 05:55

目录


为了使类属算法具有灵活性,STL常使用函数的重载机制为算法提供两种形式。算法的第一种形式使用的是常规的操作来实现。第二种形式中,算法可以根据用户指定的准测对元素经行处理。

函数对象包含了一个可以通过函数调用运算符()使用的函数。实际上,函数对象是重载了函数调用运算符operator()的类模板。

用户可以创建自己的函数对象。STL提供了算术函数对象,关系函数对象,逻辑函数对象。


算术函数对象:

  1. plus<type>                                 加
  2. minus<type>                              减
  3. multiplies<type>                       乘
  4. divides<type>                            除
  5. modulus<type>                        模
  6. negate<type>                            取反

示例代码:

#include <iostream>#include <algorithm>#include <string>#include <numeric>#include <iterator>#include <vector>#include <functional>using namespace std;int functAdd(plus<int>,int,int);int main() {// 加法函数对象plus<int> addNum;int sum = addNum(34,56);cout << "Sum=" << sum << endl;// 字符串拼接plus<string> joinString;string s1 = "hello";string s2 = "There";string str = joinString(s1,s2);cout << "str=" << str << endl;// 调用外部函数cout << "funcAdd=" << functAdd(addNum,34,26) << endl;int list[8] = {1,2,3,4,5,6,7,8};vector<int> intsList(list,list+8);ostream_iterator<int> screenOut(cout, " ");cout << "intList:";copy(intsList.begin(),intsList.end(),screenOut);cout << endl;//累计int suma = accumulate(intsList.begin(),intsList.end(),0);cout << "accumulate:" << suma << endl;int product = accumulate(intsList.begin(),intsList.end(),1,multiplies<int>());cout << "product:" << product << endl;return 0;}int functAdd(plus<int> sum,int x,int y) {return sum(x, y);}

运行结果:

intQueue.front:26
intQueue.back:33
intQueue.front:18
intQueue :
18 50 33


关系函数对象:

  1. equal_to<type>                                      等于
  2. not_equal_to<type>                              不等于
  3. greater<type>                                         大于
  4. greater_equal<type>                             大于等于
  5. less<type>                                              小于
  6. less_equal<type>                                 小于等于

示例代码:

#include <iostream>#include <algorithm>#include <string>#include <numeric>#include <iterator>#include <vector>#include <functional>using namespace std;int main() {// 等于equal_to<int> compare;bool isEqual = compare(6,6);cout << "isEqual=" << isEqual << endl;// 大于greater<string> greaterString;string s1 = "hello";string s2 = "there";if (greaterString(s1, s2)){cout << s1 << " is greater than " << s2 << endl;} else {cout << s2 << " is greater than " << s1 << endl;}int temp[8] = {2,3,4,5,1,7,8,9};vector<int> vecList(temp,temp+8);vector<int>::iterator intItr1,intItr2;ostream_iterator<int> screen(cout, " ");cout << "vecList:" <<endl;copy(vecList.begin(),vecList.end(),screen);cout << endl;intItr1 = adjacent_find(vecList.begin(),vecList.end(),greater<int>());intItr2 = intItr1 + 1;cout << "intItr1:" << *intItr1 <<",intItr2:" << *intItr2 << endl;cout << "psition:" << vecList.end() - intItr2 << endl;cout << "psition:" << intItr2 - vecList.begin() << endl;return 0;}

运行结果:

isEqual=1
there is greater than hello
vecList:
2 3 4 5 1 7 8 9
intItr1:5,intItr2:1
psition:4
psition:4


逻辑运算对象:

  1. logical_not<type>
  2. logical_and<type>
  3. logical_or<type>



1 0
原创粉丝点击