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

重载函数调用操作符的类,其对象常称为函数对象(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. eclipse代码自动提示,eclipse设置代码自动提示

    eclipse代码自动提示,eclipse设置代码自动提示 eclipse是很多JAVA开发者基本上都用的工具,用它可以很方便的开发JAVA代码,当编写JAVA代码时,大部分人都是按组合键[Alt+/ ...

  2. 2018.09.11 bzoj3629: [JLOI2014]聪明的燕姿(搜索)

    传送门 一道神奇的搜索. 直接枚举每个质因数的次数,然后搜索就行了. 显然质因数k次数不超过logkn" role="presentation" style=" ...

  3. Excel获得焦点变色

    1.  点击 Sheet 2. 右键菜单  查看代码 3. 复制如下代码 Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Ran ...

  4. Redis总结和提取常用的和重要的命令

    一:Redis的结构和其数据类型(注redis默认端口号是6379) 1)Redis可以部署多套(多个进程不同端口或直接部署在不同主机),每个Redis都可以有多个db,通过select来选择,默认的 ...

  5. ansible facts 获取硬件信息

    facts 指的是 ansible_facts 变量,ansible 中使用 setup 模块来获取,包含系统的大部分基础硬件信息, [root@10_1_162_39 host_vars]# ll ...

  6. 11.字符串{a,b}的幂集[回溯递归]

    我一直在想着这个事,早晨起来五六点,躺在床上冥想.突然悟解了,真如某些书上写的,大道不过三言两语,说破一文不值.还是按照老方法,把问题最大程度的精简,现在求集合A={a,b}的幂集,只有两个元素,应该 ...

  7. Get同步请求

    //同步get请求 //    NSURL: iOS 中的URL存储类,可存储网址或者文件路径         NSString *urlString = @"http://api.map. ...

  8. (网络流 模板 Dinic) Drainage Ditches --POJ --1273

    链接: http://poj.org/problem?id=1273 代码: //Dinic #include<stdio.h> #include<string.h> #inc ...

  9. 获取Oracle EBS数据库跟踪文件方法

    http://www.orapub.cn/posts/1624.html 一.以下在Oracle APP中执行: 1) Set the Profile Option: ‘Initialization ...

  10. 网友写的解决uniGUI限制的方法

    群友写的解决uniGUI试用版限制修改SessionTimeOut,思路很精巧,贴过来分享,感谢朋友的奉献.当然,如果真正用uniGUI实做项目,买份正版是正道! var   UniServerOpt ...