一:函数对象(仿函数):实现状态记录等其他操作<相对于普通函数>

重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。
即是重载了“()”操作符的普通类对象。
一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个类对象,如果没有上下文,完全可以把它看作一个函数对待。
“在标准库中,函数对象被广泛地使用以获得弹性”,标准库中的很多算法都可以使用函数对象或者函数指针来作为自定的回调行为;
一元函数对象:函数参数1个;

二元函数对象:函数参数2个;

(一)一元函数对象案例:实现数据显示

普通函数调用:

//普通函数
template<typename T>
void funcShow(T& t)
{
cout << t << endl;
} int main()
{
int a = ;
funcShow<int>(a);
}

仿函数调用:

//函数对象
template<typename T>
class classShow
{
public:
int count; classShow()
{
count = ;
} void operator()(const T& t)
{
this->count++; //状态记录
cout << count<<"--->"<<t << endl; //功能实现

}
}; int main()
{
int a = ;
classShow<int> cs; //函数对象 cs(a);
cs(a + );
cs(a + ); system("pause");
return ;
}

(二)二元函数对象案例:实现两个数相加

仿函数实现:

template<typename T>
void ShowEle(const T& t)
{
cout << t << " ";
} //仿函数
template<typename T>
struct SumAdd{ //C++中结构体可以实现类的相关操作
T operator()(const T& t1,const T& t2)
{
return t1 + t2;
}
}; int main()
{
vector<int> v1, v2,v3; for (int i = ; i < ; i++)
{
v1.push_back(rand() % );
v2.push_back(rand() % );
} for_each(v1.begin(), v1.end(), ShowEle<int>);
cout << endl;
for_each(v2.begin(), v2.end(), ShowEle<int>);
cout << endl;
v3.resize(); //需要提前分配好空间
vector<int>::iterator iter = transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), SumAdd<int>()); for_each(v3.begin(), v3.end(), ShowEle<int>); system("pause");
return ;
}

二:谓词:实现过滤

可以使用谓词来表示逻辑条件,用于描述对象持久性存储在内存中的对象过滤。其实意思就是:我是一个过滤器,不符合条件的都滚开。
一元谓词函数参数1个,函数返回值是bool类型,可以作为一个判断式

二元谓词函数参数2个,函数返回值是bool类型
谓词可以使一个仿函数,也可以是一个回调函数。

(一)一元谓词案例

回调函数实现:判断string对象长度是否大于6

bool GT6(const string& s)
{
return s.size() > 6;
}

仿函数实现:找出被某个数整除的所有元素

template <typename T>
class IsDiv
{
private:
T divisor;
public:
IsDiv(const T& d)
{
this->divisor = d;
} bool operator()(T& t)
{
return (t%divisor == 0);
}
};
int main()
{
vector<int> v; for (int i = ; i < ; i++)
v.push_back(i); IsDiv<int> isdiv(); //被4整除 vector<int>::iterator iter; //返回找到符合条件的第一个
iter = find_if(v.begin(), v.end(), isdiv); //find_if(v.begin(), v.end(), IsDiv<int>(4));
if (iter != v.end())
{
cout << "find first can divided by 4 is " << *iter << endl;
}
else
cout << "can't find" << endl; system("pause");
return ;
}

(二)二元谓词案例

回调函数实现:比较两个字符串,第一个字符串长度是否大于第二个

bool isShorter(const string &s1, const string &s2)
{
return s1.size() < s2.size();
}

函数对象实现:实现按照二元谓词进行排序

void printEle(int &v)    //遍历用
{
cout << v << " ";
} template<typename T>
class My_Sort_Desc
{
public:
bool operator()(T& t1, T& t2)
{
return t1 > t2;
}
}; int main()
{
vector<int> v; for (int i = ; i < ; i++)
v.push_back(rand()%); //打印元素
for_each(v.begin(), v.end(), printEle);
cout << endl; //进行排序
sort(v.begin(), v.end(), My_Sort_Desc<int>()); //打印元素
for_each(v.begin(), v.end(), printEle); system("pause");
return ;
}

三:预定义函数对象

(一)基本概念:标准模板库STL提前定义了很多预定义函数对象

注意:要使用预定义函数对象必须引入#include <functional>

(二)算数函数对象

预定义的函数对象支持加、减、乘、除、求余和取反。调用的操作符是与type相关联的实例
加法:plus<Types>

减法:minus<Types>

乘法:multiplies<Types>

除法divides<Tpye>

求余:modulus<Tpye>

取反:negate<Type>
plus<string> stringAdd;
sres = stringAdd(sva1,sva2);  //加法函数对象使用 negate<int> intNegate;
ires = intNegate(ires);  //取反函数对象使用

(三)关系函数对象

等于equal_to<Tpye>

不等于not_equal_to<Type>

大于 greater<Type>

大于等于greater_equal<Type>

小于 less<Type>

小于等于less_equal<Type>
equal_to<string> stringEqual;  //等于函数对象使用
sres = stringEqual(sval1,sval2);

(四)逻辑函数对象

逻辑与 logical_and<Type>

逻辑或logical_or<Type>

逻辑非logical_not<Type>
logical_and<int> indAnd;
ires = intAnd(ival1,ival2);  //逻辑与函数对象使用

02--STL算法(函数对象和谓词)的更多相关文章

  1. STL 算法中函数对象和谓词

    STL 算法中函数对象和谓词 函数对象和谓词定义 函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特 ...

  2. STL算法中函数对象和谓词

    函数对象和谓词定义 函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列 ...

  3. C++STL 函数对象和谓词

    函数对象:重载函数调用操作符的类,其对象常称为函数对象. 函数对象属于类对象,能突破函数概念,保持类的状态 谓词: 一元函数对象:函数参数1个: 二元函数对象:函数参数2个: 一元谓词 函数参数1个, ...

  4. C++ STL 之 函数对象适配器

    谓词是指普通函数或重载的 operator()返回值是 bool 类型的函数对象(仿函数).如果operator 接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词,谓词可作为一个判断 ...

  5. ###STL学习--函数对象

    点击查看Evernote原文. #@author: gr #@date: 2014-08-13 #@email: forgerui@gmail.com 在stl中,函数对象被大量地使用,用以提高代码的 ...

  6. C++ STL 之 函数对象

    重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用.注意 ...

  7. C++STL算法函数总结

    容器自己定义了的算法vector:swaplist:swap,merge,splice,remove,remove_if,reverse,uniquedeque:swapmap,set,multise ...

  8. 条款20 STL函数对象

    继承标准STL的函数对象 1: struct PopLess : public atd::binary_function<state,state,bool> 2: { 3: bool op ...

  9. STL 算法罗列 (转)

    非修改性序列操作(12个) 循环 for_each() 对序列中的每个元素执行某操作 查找 find() 在序列中找出某个值的第一次出现的位置 find_if() 在序列中找出符合某谓词的第一个元素 ...

随机推荐

  1. 浅析10种常见的黑帽seo手法

    虽然博主并不认同黑帽seo手法,但是一些常见的黑帽手法还是需要了解的,增加自己对黑帽的认知,也可以在自己优化网站时适时的规避开这些黑帽手法,从而避免自己的网站被搜索引擎惩罚.好了,话不多说,下面进入今 ...

  2. Servlet的Cookie值保存与获取

    今天测试设置和获取Cookie遇到了一点小问题,很奇怪的问题:把J2ee服务部署在本地 8080端口:访问任何一个服务时,如果客户端没有cookie,则下发cookie, 如果客户端已经有了该cook ...

  3. 2018.10.15 NOIP训练 百事世界杯之旅(期望dp)

    传送门 期望题. 其实跟dpdpdp关系并不大. 考虑f[i]f[i]f[i]表示已经凑出了iii个需要的次数. 显然有:f[i]=ni∗f[i]+nn−i∗f[i+1]+1f[i]=\frac {n ...

  4. 山东省第七届ACM竞赛 J题 Execution of Paladin (题意啊)

    题意:鱼人是炉石里的一支强大种族,在探险者协会里,圣骑士有了一张新牌,叫亡者归来,效果是召唤本轮游戏中7个已死鱼人.如果死掉的不足7个,那么召唤的数量就会不足7. 鱼人有很多,下面的4个是: 寒光智者 ...

  5. 关于FIR的modelsim

    (1)FIR ip核仿真 (2)FIR 多通道应用 (3)多通道fir ip核需要注意的复位问题 =================================================== ...

  6. PAT甲 1032. Sharing (25) 2016-09-09 23:13 27人阅读 评论(0) 收藏

    1032. Sharing (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue To store Engl ...

  7. 类之间关系理解:组合>聚合>关联>依赖;实现,继承

    类之间关系理解:组合>聚合>关联>依赖:实现,继承 1. 从类之间的关系来看,不外乎以下几种 组合>聚合>关联>依赖:实现,继承 且可以分为以下两类: (1)实现, ...

  8. windows下用C++获取本机IP地址

    BSTR CamUtilsCtrl::GET_TERM_IP(void){ AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString strResult ...

  9. vim 配置半透明

    转载两个博客 链接一 链接二

  10. 无限存储之胖文本数据库TTD(Thick Text Database)

    无限存储之胖文本数据库TTD(Thick Text Database) 阅读:  评论:  作者:Rybby  日期:  来源:rybby.com 所谓的“胖”就是多.大.丰富的意思,像我们平时看到的 ...