函数对象,一元谓词,二元谓词,预定义函数对象

时间:2021-10-06 04:20:36
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对象
	}
};