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.26洛谷P1084 疫情控制(二分+倍增)
传送门 好题啊. 题目要求的最大值最小,看到这里自然想到要二分答案. 关键在于怎么检验. 显然对于每个点向根走比向叶节点更优. 因此我们二分答案之后,用倍增将每个点都向上跳到跳不动为止. 这时我们ch ...
- HDU 1503 Advanced Fruits (LCS+DP+递归)
题意:给定两个字符串,让你求一个最短的字符串,并且这个字符串包含给定的两个. 析:看到这个题,我知道是DP,但是,不会啊...完全没有思路么,我就是个DP渣渣,一直不会做DP. 最后还是参考了一下题解 ...
- spring mvc 文档哪里有
官方: http://docs.spring.io/spring/docs/4.2.0.RC1/spring-framework-reference/htmlsingle/#spring-web Th ...
- 17)maven-surefire-plugin
http://maven.apache.org/surefire/maven-surefire-plugin/ Goals Overview The Surefire Plugin has only ...
- pathinfo()在php不同版本中对于对多字节字符处理的不同结果
phpinfo()函数在处理路径时,在php的低版本中无法处理多字节字符,这里测试的是php5.3和php5.6 的区别 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- PHP 7 安装 Memcache 和 Memcached 总结
Memcache 与 Memcached 的区别 Memcached 是 Memcache 的升级版,优化了 Memcache,并增加了一些操作方法.所以现在基本都是用最近版本的. PHP 7 下安装 ...
- jquery添加select option两种代码思路比较
功能需求:在客户选择了check_in_date和check_out_date之后,将在check_in_date至check_out_date的promotions中自动添加符合条件的promoti ...
- 【WinRT】获取 Uri 中的参数(QueryString)键值对
在控制台或者其它类型的项目中,可以添加 System.Web,使用以下代码来获取一个 Uri 中的参数 Uri uri = new Uri("http://www.cnblogs.com/h ...
- C# 基础篇
全篇依据 C#高级编程(第9版) 内容记录: 基础知识C# 5.0 基础 分为15章内容来介绍 核心C# 对象和类型 继承 泛型 数组 运算符和类型强制转换 委托和lambda表达式,事件 字符串和正 ...
- mvc基础知识(1)
复制大佬的,侵权请联系我主动删除 1.js/css合并 在之前的crud例子中,我们引入js/css脚本的方式和平常的web开发一样 <script src="~/Scripts/jq ...