怎么建设一个响应式网站,杭州百度百家号seo优化排名,汽车之家网站系统是什么做的,免费手机网站开发目录 函数对象#xff1a;
谓词#xff1a;
一元谓词函数举例如下
二元谓词举例如下
函数对象和函数的区别
一元谓词的案例
二元函数对象案例
二元谓词案例 函数对象#xff1a;
重载函数调用操作符的类#xff0c;其对象常称为函数对象#xff08;function obj…目录 函数对象
谓词
一元谓词函数举例如下
二元谓词举例如下
函数对象和函数的区别
一元谓词的案例
二元函数对象案例
二元谓词案例 函数对象
重载函数调用操作符的类其对象常称为函数对象function object即它们是行为类似函数的对象。一个类对象表现出一个函数的特征就是通过“对象名(参数列表)”的方式使用一个类对象如果没有上下文完全可以把它看作一个函数对待。
这是通过重载类的operator()来实现的。
“在标准库中函数对象被广泛地使用以获得弹性”标准库中的很多算法都可以使用函数对象或者函数来作为自定的回调行为
谓词
一元函数对象函数参数1个
二元函数对象函数参数2个
一元谓词 函数参数1个函数返回值是bool类型可以作为一个判断式
谓词可以使一个仿函数也可以是一个回调函数。
二元谓词 函数参数2个函数返回值是bool类型。
一元谓词函数举例如下
1判断给出的string对象的长度是否小于6
bool GT6(const string s)
{
return s.size() 6;
}
2,判断给出的int是否在3到8之间
bool Compare( int i )
{
return ( i 3 i 8 );
}
二元谓词举例如下
1比较两个string对象返回一个bool值指出第一个string是否比第二个短
bool isShorter(const string s1, const string s2)
{
return s1.size() s2.size();
}
函数对象和函数的区别
//函数对象是属于类对象能突破函数的概念能保持调用状态信息
//函数对象的好处
//for_each算法中函数对象做函数参数
//for_each算法中函数对象当返回值
void main02()
{vectorint v1;v1.push_back(1);v1.push_back(3);v1.push_back(5);for_each(v1.begin(), v1.end(), ShowElemtint());//匿名仿函数对象cout endl;for_each(v1.begin(), v1.end(), FuncShowElemt2);//通过回调函数ShowElemtint show1;//for_each算法的函数对象的传递是元素值传递不是引用传递for_each(v1.begin(), v1.end(), show1);show1.printN();cout 通过for_each算法的返回值看调用的次数 endl;show1 for_each(v1.begin(), v1.end(), show1);show1.printN();
} 通过这个案例我们可以发现函数对象和函数最大的区别是函数对象可以记录函数的状态普通函数需要记录值的时候只能使用全局变量的方式来实现破坏了程序的封装性。
一元谓词的案例
templatetypename T
class IsDiv
{
public:IsDiv(const T divisor){this-divisor divisor;}bool operator()(T t){return (t % divisor 0);}
private:T divisor;
};void main03()
{vectorint v2;for (int i 10; i 33; i){v2.push_back(i);}int a 4;IsDivint myDiv(a);vectorint::iterator iter find_if(v2.begin(), v2.end(), myDiv);if (iter v2.end()){cout 容器中没有元素是4的倍数 endl;}else{cout 第一个被4整除的元素是: *iter endl;}} 二元函数对象案例
//二元函数对象
template typename T
class SumAdd
{
public:T operator()(T t1, T t2){return t1 t2;}
};//二元函数对象
void main04()
{//v1 v2v3vectorint v1, v2;vectorint v3;v1.push_back(1);v1.push_back(3);v1.push_back(5);v2.push_back(2);v2.push_back(4);v2.push_back(6);v3.resize(10);transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), SumAddint());for (vectorint::iterator it v3.begin(); it ! v3.end(); it){cout *it endl;}
} 二元谓词案例
bool MyCompare(const int a, const int b)
{return a b; //从小到大
}//二元谓词
void main05()
{vectorint v1(10);for (int i 0; i 10; i){int tmp rand() % 100;v1[i] tmp;}for (vectorint::iterator it v1.begin(); it ! v1.end(); it){cout *it ;}cout endl;//遍历for_each(v1.begin(), v1.end(), FuncShowElemt2);cout endl;sort(v1.begin(), v1.end(), MyCompare);for_each(v1.begin(), v1.end(), FuncShowElemt2);cout endl;}