02--STL算法(函数对象和谓词)
一:函数对象(仿函数):实现状态记录等其他操作<相对于普通函数>
重载函数调用操作符的类,其对象常称为函数对象(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算法(函数对象和谓词)的更多相关文章
- STL 算法中函数对象和谓词
STL 算法中函数对象和谓词 函数对象和谓词定义 函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特 ...
- STL算法中函数对象和谓词
函数对象和谓词定义 函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列 ...
- C++STL 函数对象和谓词
函数对象:重载函数调用操作符的类,其对象常称为函数对象. 函数对象属于类对象,能突破函数概念,保持类的状态 谓词: 一元函数对象:函数参数1个: 二元函数对象:函数参数2个: 一元谓词 函数参数1个, ...
- C++ STL 之 函数对象适配器
谓词是指普通函数或重载的 operator()返回值是 bool 类型的函数对象(仿函数).如果operator 接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词,谓词可作为一个判断 ...
- ###STL学习--函数对象
点击查看Evernote原文. #@author: gr #@date: 2014-08-13 #@email: forgerui@gmail.com 在stl中,函数对象被大量地使用,用以提高代码的 ...
- C++ STL 之 函数对象
重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用.注意 ...
- C++STL算法函数总结
容器自己定义了的算法vector:swaplist:swap,merge,splice,remove,remove_if,reverse,uniquedeque:swapmap,set,multise ...
- 条款20 STL函数对象
继承标准STL的函数对象 1: struct PopLess : public atd::binary_function<state,state,bool> 2: { 3: bool op ...
- STL 算法罗列 (转)
非修改性序列操作(12个) 循环 for_each() 对序列中的每个元素执行某操作 查找 find() 在序列中找出某个值的第一次出现的位置 find_if() 在序列中找出符合某谓词的第一个元素 ...
随机推荐
- 2018.09.23 孙悟空大战鲤鱼精(单调队列优化dp)
描述 孙悟空大战鲤鱼精,孙悟空在通天河遇到鲤鱼精,他嫉恶如仇,看见妖精就手痒(忘了自己是妖精).但是鲤鱼精知道孙悟空的厉害,在孙悟空来到通天河,鲤鱼精就跑到了河对面.于是孙悟空就去追鲤鱼精. 我们可以 ...
- 2018.07.04 POJ 1265 Area(计算几何)
Area Time Limit: 1000MS Memory Limit: 10000K Description Being well known for its highly innovative ...
- 2018.07.24 bzoj3531: [Sdoi2014]旅行(树链剖分+动态开点)
传送门 树链剖分. 如何维护? 如果颜色少直接每种颜色一颗线段树走人. 但这题颜色数量不大于1e5" role="presentation" style="po ...
- Django模型层(1)
https://www.cnblogs.com/yuanchenqi/articles/8933283.html MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦, ...
- DevExpress gridcontrol Master-Detail绑定到对象类型
数据库:C_ProductPlan ,C_ProductPlanItemDTO定义:(实现每个计划条目-Master,对应多个ProcessInfo-Detail) [DataContract] [S ...
- idea使用svn提交时出现错误Warning not all local changes may be shown due to an error
参考于https://www.cnblogs.com/zhujiabin/p/6708012.html 解决方案: 1.File > Settings > Version Control ...
- 优秀前端工程师必备:" checkbox & radio--单钩 & 多钩 "大比较:你是♂||♀ , 还是 ♂&♀
1 单选: type="radio" 需求: 男女input只能选择一个 <input type="radio" name="sex" ...
- SPSS—回归—曲线估计方程案例解析
上一节介绍了线性回归,虽然线性回归能够满足大部分的数据分析的要求,但是,线性回归并不是对所有的问题都适用, 因为有时候自变量和因变量是通过一个已知或未知的非线性函数关系相联系的,如果通过函数转换,将关 ...
- Codeforces735D Taxes 2016-12-13 12:14 56人阅读 评论(0) 收藏
D. Taxes time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...
- Asp.net Core2.0, 基于 claims 实现权限验证
https://www.cnblogs.com/KimmyLee/p/6430474.html