find_if , sort , for_each 的使用 for_each(v1.begin(), v1.end(), ShowElemt<int>() ) ; 要使用预定义函数对象需要包含 functional 头文件
vector<int>::iterator it = find_if(v1.begin(), v1.end(), myint ) sort(v3.begin(),v3.end(),Compare) ; // 按从大到小(递减)排序
#include <iostream> #include <vector> #include <algorithm> using namespace std ; //定义函数对象 (重载函数运算符的类) template <typename T> class ShowElem { public: ShowElem(){ n = 0 ; } void operator()(T &t) { cout << t << " "; ++ n ; } void printN(){ cout <<"n " << n << " " << endl; } protected: private: int n ; }; void Show(int & a) { cout << a << " " ; } int main(){ ShowElem<int> showElemt ; vector<int> v1 ; v1.push_back(1); v1.push_back(2); v1.push_back(3); showElemt = for_each(v1.begin(), v1.end(), showElemt ) ; //showElemt = for_each(v1.begin(), v1.end(), ShowElemt<int>() ) ; // 第三个参数为匿名函数对象,匿名仿函数 此处即可遍历输出。 // 函数对象能记录部分状态信息。 返回一个函数对象即可,再调用相应的函数输出状态。 showElemt.printN(); for_each(v1.begin(), v1.end(),Show ) ; } //ShowElem<int> showElemt ; //showElemt(a) 函数对象的() 执行像一个函数//仿函数
一元谓词:函数参数一个,函数返回值是bool类型 ; 二元谓词:函数参数二个,函数返回值是bool类型
find_if 返回的是一个迭代器。使用案例:
#include <iostream> #include <vector> #include <algorithm> using namespace std ; template <class T > class Lv{ public : Lv(const T & dis) { this->dis = dis ; } bool operator()(T &t){ return (t%dis == 0) ; } protected : private : T dis ; }; int main(){ vector<int> v1 ; for( int i=1; i<10; ++i) { v1.push_back(i); } int a = 3 ; Lv<int> myint(a) ; vector<int>::iterator it = find_if(v1.begin(), v1.end(), myint ) ; // 返回的是迭代器 cout << *it ; } // 程序输出的是 vector中第一个能被3整除的数。
二元谓词使用场景:可对两个对象进行操作,(+ - * / 或者是大小比较)
下面是二元函数对象的案例
#include <iostream> #include <vector> #include <algorithm> using namespace std ; //定义函数对象 template <typename T> class ShowElem { public: ShowElem(){ n = 0 ; } void operator()(T &t) { cout << t << " "; ++ n ; } void printN(){ cout <<"n " << n << " " << endl; } protected: private: int n ; }; template <class T > class Sumadd{ public : T operator()(T t1,T t2){ return t1+t2 ; } protected : private : T dis ; }; int main(){ vector<int> v1 ; vector<int> v2 ; vector<int> v3 ; for( int i=1; i<=10; ++i) { v1.push_back(i); v2.push_back(i); } int a = 3 ; v3.resize(10) ; transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), Sumadd<int>( )) ; // 返回的是迭代器 for_each(v3.begin(),v3.end(),ShowElem<int>()) ; }二元谓词的案例:
#include <iostream> #include <vector> #include <algorithm> using namespace std ; //定义函数对象 template <typename T> class ShowElem { public: ShowElem(){ n = 0 ; } void operator()(T &t) { cout << t << " "; ++ n ; } void printN(){ cout <<"n " << n << " " << endl; } protected: private: int n ; }; template <class T > class Sumadd{ public : T operator()(T t1,T t2){ return t1+t2 ; } protected : private : T dis ; }; bool Compare(const int &a , const int &b) { return a > b ; } int main(){ vector<int> v1 ; vector<int> v2 ; vector<int> v3 ; for( int i=1; i<=10; ++i) { v1.push_back(i); v2.push_back(i); } int a = 3 ; v3.resize(10) ; transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), Sumadd<int>( )) ; // 返回的是迭代器 sort(v3.begin(),v3.end(),Compare) ; // 按从大到小(递减)排序 for_each(v3.begin(),v3.end(),ShowElem<int>()) ; }
set.find 函数默认会区分大小写,要不区分大小写,可自己定义一个仿函数(函数对象) 然后在定义set时
set<int , ComapreNocase> set1 ; 即可
struct CompareNocase{ bool operator()(const string&str1 , congst string & str2){ string str_1; str_1.resize(str1.size()); transform(str1.begin(),str2.begin(),str_1.begin(), tolower) // tolower是预定于函数Udin对象 bool operator()(const string&str1 , congst string & str2){ string str_2; str_2.resize(str2.size()); transform(str2.begin(),str2.begin(),str_2.begin(), tolower) // tolower是预定于函数Udin对象 } };