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

重载函数调用操作符的类,其对象常称为函数对象(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. 2018.10.16 uoj#340. 【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂优化dp)

    传送门 一道不错的矩阵快速幂优化dpdpdp. 设f[i][j][k][l]f[i][j][k][l]f[i][j][k][l]表示前iii轮第iii轮还有jjj个一滴血的,kkk个两滴血的,lll个 ...

  2. C++之类和对象的特性

    简介:C++并不是一个纯粹的面向对象的语言,而是一种基于过程和面向对象的混合型的语言. 凡是以类对象为基本构成单位的程序称为基于对象的程序,再加上抽象.封装.继承和多态就成为面向对象程序. 1.掌握类 ...

  3. js模态窗口返回值(table)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. HDU 1242 Rescue (BFS+优先队列)

    题意:X代表卫兵,a代表终点,r代表起始点,.代表路,#代表墙,走过.要花费一秒,走过x要花费2秒,求从起点到终点的最少时间. 析:一看到样例就知道是BFS了吧,很明显是最短路径问题,不过又加了一个条 ...

  5. java基础-day5

    第05天 java基础知识 今日内容介绍 u 方法的概述及基本使用 u 方法的练习及注意事项 u 方法的重载及参数传递 u 方法的操作数组的练习 第1章   方法的概述及基本使用 1.1  方法定义格 ...

  6. 初探FFT(快速傅里叶变换)

    第一次接触省选的知识点呢!zrf大佬在课堂上讲的非常清楚,但由于本蒟蒻实在太菜了,直接掉线了.今天赶紧恶补一下. 那么这篇博客将分为两块,第一块是FFT的推导和实现,第二块则是FFT在OI上的应用 因 ...

  7. DFS剪枝处理HDU1010

    http://acm.hdu.edu.cn/showproblem.php?pid=1010 题意很好理解,不是最短路,而是dfs,虽然地图不算大,稍微注意一点的dfs也能险过,但是700+ms和78 ...

  8. Android-Thread线程的状态

    介绍Thread线程的状态之前,必须要讲解CPU执行线程的随机性: 例如:有五个线程,CPU中央处理器,在执行这五个线程的时候,有可能先执行Thread-0,有可能先执行Thread-3,等等,都有可 ...

  9. asp.net——公共帮助类

    在项目开发中公共帮助类是必不可少的,这里记录一些自己摘录或自己编写的帮助类. 64位编码与解码: #region URL的64位编码 /// <summary> /// URL的64位编码 ...

  10. NetCore入门篇:(十二)在IIS中部署Net Core程序

    一.简介 微软已经为net在iis中的部署提供了良好的支持,在IIS中部署NetCore是一件很容易的事. 二.在IIS中部署Net Core程序 1.微软官方文档有详细说明.进入 2.如果你已经熟悉 ...