c++之STL(9)重载函数调用操作符 函数对象 谓词

来源:互联网 发布:凡人修仙传优化补丁 编辑:程序博客网 时间:2024/06/15 18:24

重载函数调用操作符

函数对象:定义了调用操作符的类,其对象称为“函数对象”

如果函数对象的返回值是bool 类型的,那么我们就称为它为谓词


一元函数对象 :函数返回一个值

一元谓词 :若返回值有一个对象,并且为bool类型的,

二元函数:对象函数对象有两个参数 

二元谓词:函数返回为bool


#include<iostream>//#include<vector>#include<list>#include<algorithm>using namespace std;//class absInt{////public://int operator()(int val){////}//};// struct 里默认是公用的struct absInt{// 重载操作符:函数调用操作符int operator()(int val){return val < 0 ? -val : val;}};// 普通函数template<typename elementType>void FuncDisplayElement(const elementType &element){cout << element << endl;};// 函数对象 类是有数据成员的,那么就可以保持状态template<typename elementType>struct DisplayElement{void operator()(const elementType &element) const{cout << element << endl;}};int main(){int i = -42;absInt absObj;unsigned int ui = absObj(i);cout << ui << endl;cout << "Hello 函数对象!" << endl;vector<int> a;for (int i = 0; i < 10; i++){a.push_back(i);}list<char> b;for (char c = 'a'; c < 'k'; ++c){b.push_back(c);}// STL算法for_each(a.begin(), a.end(), DisplayElement<int>());cout << endl;for_each(b.begin(), b.end(), DisplayElement<char>());cout << endl;//system("pause");return 0;}
#include<iostream>#include<vector>#include<algorithm>using namespace std;// 函数对象template<typename numberType>struct  IsMutiple// 默认是公认的{numberType m_Divisor;IsMutiple(const numberType &divisor){m_Divisor = divisor;}bool operator()(const numberType &element)const{return((element % m_Divisor) == 0);}};int main(){IsMutiple<int> a(4);vector<int> vecIntergers;for (int i = 25; i < 100; i++){vecIntergers.push_back(i);}vector<int>::iterator iElement;iElement = find_if(vecIntergers.begin(), vecIntergers.end(), a);if (iElement != vecIntergers.end()){cout << "第一个4的整数倍的数是:" <<  *iElement<< endl;}//system("pause");return 0;}

#include<iostream>#include<vector>#include<algorithm>using namespace std;// 函数对象 一元谓词template<typename numberType>struct  IsMutiple// 默认是公认的{numberType m_Divisor;IsMutiple(const numberType &divisor){m_Divisor = divisor;}bool operator()(const numberType &element)const{return((element % m_Divisor) == 0);}};int main(){//IsMutiple<int> a(4);vector<int> vecIntergers;for (int i = 25; i < 100; i++){vecIntergers.push_back(i);}vector<int>::iterator iElement;iElement = find_if(vecIntergers.begin(), vecIntergers.end(), IsMutiple<int>(4));if (iElement != vecIntergers.end()){cout << "第一个4的整数倍的数是:" <<  *iElement<< endl;}//system("pause");return 0;}

二元函数对象和二元谓词

#include<iostream>#include<vector>#include<algorithm>using namespace std;//二元函数对象  这个不是谓词,只有返回值是bool,才被称为谓词template<typename elementType>class CMultiply{public:elementType operator()(const elementType &elem1, const elementType &elem2){return elem1 * elem2;}};int main(){vector<int> a, b;for (int i = 0; i < 10; i++)a.push_back(i);for (int j = 100; j < 110; j++)b.push_back(j);vector<int> vecResult;vecResult.resize(10);// 设置大小10个// STL 算法transform(a.begin(), a.end(), b.begin(), vecResult.begin(), CMultiply<int>());// 对向量进行循环for (size_t nIndex = 0; nIndex < vecResult.size(); nIndex++){cout << vecResult[nIndex] << endl;}//system("pause");return 0;}
#include<iostream>#include<set>#include<string>#include<algorithm>using namespace std;// 二元谓词 改变容器默认的行为class CCompareStringNoCase{public:bool operator()(const string & str1, const string &str2)const{string str1LowerCase;str1LowerCase.resize(str1.size());transform(str1.begin(), str1.end(), str1LowerCase.begin(), tolower);//string str2LowerCase;str2LowerCase.resize(str2.size());transform(str2.begin(), str2.end(), str2LowerCase.begin(), tolower);return(str1LowerCase < str2LowerCase);}};int main(){set<string> xm;set<string, CCompareStringNoCase> names;// 不分大小写,自己定义的一个set 容器names.insert("Tina");names.insert("jim");names.insert("Jack");names.insert("Sam");names.insert("hello");set<string>::iterator iNameFound = names.find("jim");if (iNameFound != names.end()){cout << "找到了:" << *iNameFound << endl;}else{cout << "" << endl; }//system("pause");return 0;}




0 0
原创粉丝点击