社区
工具平台和程序库
帖子详情
在STL中函数与函数对象有什么区别?用在什么地方?请高人赐教!!!
CityFantom
2004-08-28 02:04:58
在STL中函数与函数对象有什么区别?用在什么地方?具体是怎么用呢?什么地方有讲解这方面的资料么?
...全文
239
9
打赏
收藏
在STL中函数与函数对象有什么区别?用在什么地方?请高人赐教!!!
在STL中函数与函数对象有什么区别?用在什么地方?具体是怎么用呢?什么地方有讲解这方面的资料么?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
roy
2004-08-31
打赏
举报
回复
简单的说,函数对象是,为实现普通函数功能(保持调用方试),重载操作符()的类
wuyapu
2004-08-31
打赏
举报
回复
Andy84920(你也不懂) 讲的好,太妙了
albertlee
2004-08-31
打赏
举报
回复
mark
sharkhuang
2004-08-30
打赏
举报
回复
会带来隐含转换吧.是不是?
steel007
2004-08-28
打赏
举报
回复
一个是函数 function
一个是函数对象,也叫仿函数 functor,一般为structure,通过重载operator()实现
仿函数可以向函数一样的使用,带来的是编程上的便捷性。同时,过去一些需要用函数指针的东东,现在可以使用仿函数来替代。此时,传入的是一个仿函数的对象。
梧桐168
2004-08-28
打赏
举报
回复
这个叫做predicate
你可以看看More Exceptional C++的条款2,3
对于predicate十分精辟的解析。
wshcdr
2004-08-28
打赏
举报
回复
好东西
CityFantom
2004-08-28
打赏
举报
回复
这么说只要是重载了operator()操作符的任何类都可以是一个函数对象了!君之一席话如提壶灌顶令我茅塞顿开!thank you!!!
Andy84920
2004-08-28
打赏
举报
回复
函数对象:就是起到函数作用的对象。特别是指重定义应用算符函数operator()的类对象。
尽管函数指针被广泛用于实现函数回调,但C++还提供了一个重要的实现回调函数的方法,那就是函数对象。函数对象(也称“算符”)是重载了“()”操作符的普通类对象。因此从语法上讲,函数对象与普通的函数行为类似。
用函数对象代替函数指针有几个优点,首先,因为对象可以在内部修改而不用改动外部接口,因此设计更灵活,更富有弹性。函数对象也具备有存储先前调用结果的数据成员。在使用普通函数时需要将先前调用的结果存储在全程或者本地静态变量中,但是全程或者本地静态变量有某些我们不愿意看到的缺陷。
其次,在函数对象中编译器能实现内联调用,从而更进一步增强了性能。这在函数指针中几乎是不可能实现的。
下面举例说明如何定义和使用函数对象。首先,声明一个普通的类并重载“()”操作符:
class Negate
{
public:
int operator() (int n) { return -n;}
};
重载操作语句中,记住第一个圆括弧总是空的,因为它代表重载的操作符名;第二个圆括弧是参数列表。一般在重载操作符时,参数数量是固定的,而重载“()”操作符时有所不同,它可以有任意多个参数。
因为在Negate中内建的操作是一元的(只有一个操作数),重载的“()”操作符也只有一个参数。返回类型与参数类型相同-本例中为int。函数返回与参数符号相反的整数。
使用函数对象
我们现在定义一个叫Callback()的函数来测试函数对象。Callback()有两个参数:一个为int一个是对类Negate的引用。Callback()将函数对象neg作为一个普通的函数名:
#include
using std::cout;
void Callback(int n, Negate & neg)
{
int val = neg(n); //调用重载的操作符“()”
cout << val;
}
不要的代码中,注意neg是对象,而不是函数。编译器将语句
int val = neg(n);
转化为
int val = neg.operator()(n);
通常,函数对象不定义构造函数和析构函数。因此,在创建和销毁过程中就不会发生任何问题。前面曾提到过,编译器能内联重载的操作符代码,所以就避免了与函数调用相关的运行时问题。
为了完成上面个例子,我们用主函数main()实现Callback()的参数传递:
int main()
{
Callback(5, Negate() ); //输出 -5
}
本例传递整数5和一个临时Negate对象到Callback(),然后程序输出-5。
模板函数对象
从上面的例子中可以看出,其数据类型被限制在int,而通用性是函数对象的优势之一,如何创建具有通用性的函数对象呢?方法是使用模板,也就是将重载的操作符“()”定义为类成员模板,以便函数对象适用于任何数据类型:如double,_int64或char:
class GenericNegate
{
public:
template T operator() (T t) const {return -t;}
};
int main()
{
GenericNegate negate;
cout<< negate(5.3333); // double
cout<< negate(10000000000i64); // __int64
}
如果用普通的回调函数实现上述的灵活性是相当困难的。
标准库中函数对象
C++标准库定义了几个有用的函数对象,它们可以被放到STL算法中。例如,sort()算法以判断对象(predicate object)作为其第三个参数。判断对象是一个返回Boolean型结果的模板化的函数对象。可以向sort()传递greater<>或者less<>来强行实现排序的升序或降序:
#include // for greater<> and less<>
#include //for sort()
#include
using namespace std;
int main()
{
vector vi;
//..填充向量
sort(vi.begin(), vi.end(), greater() );//降序( descending )
sort(vi.begin(), vi.end(), less() ); //升序 ( ascending )
}
C++
STL
的基本学习(三)——
函数
对象
、谓词、适配器
C++
STL
的基本学习(三)——
函数
对象
、谓词、适配器 前言 c++的
STL
这边,还有一点点的内容
函数
对象
函数
对象
的概念 重载
函数
调用操作符的类,其
对象
常称为
函数
对象
(function object),即他们是行为类似
函数
的
对象
,也叫仿
函数
(functor),没错,上一篇文章里set容器和map容器自定义排序规则时,我们就用过了它。 其实就是重载“( )”运算符,使得类
对象
可以像
函数
那样调用。 注意:
函数
对象
(仿
函数
)是一个类,不是一个
函数
函数
对...
有关
STL
中
的容器和MFC的集合类型构造
函数
区别
的一点思考
作者:朱金灿来源:http://blog.csdn.net/clever101 晚上查了一下MSDN,对
STL
中
的容器和MFC的集合类型构造
函数
区别
有所领悟,特写下来和大家分享。不当之处,还望大家
赐教
! 以前使用MFC的集合类型,即CArray和CMap等类,再使用
STL
的vector、map等类,感觉最大的
区别
在于其构造
函数
。当时我感觉MFC的集合类型的构造
函数
怪怪的...
核
函数
中
使用C++类
如何在核
函数
中
使用类,之前我一直在核
函数
中
写的是C语言的代码,由于C++ 的优势,我不得不尝试在核
函数
中
使用C++,之前听说在cuda5.5之后就已经支持C++ 语言了,由于初学cuda的时候写了一个hello GPU 的代码,一直编译不过去。(不知道为什么核
函数
不能使用cout,如果有大牛知道,
请
赐教
小弟)一度让我以为GPU是不支持C++ 的(本人写单片机代码出身),以为cuda和单片机差不多只...
STL
中
流相关的输入输出符和get
函数
彻底总结:cin、cin.get()、cin.getline()、getline()、gets()等
函数
的用法...
我的总结: 【首先:对于流来说,就把流看成一个
中
转的仓库,对流进行<<运算或>>运算或者get
函数
的运算都是指,把“流”
中
的数据“运送”到“内存变量”
中
去,还是把内存变量
中
的数据“拷贝”到流
中
去。注意这里“运送”和“拷贝”的
区别
,我专门用“运送”这个动作来表示每次运算完后流的定位符都会发生变化。】 【第二,对于输入输出是以内存变量为
中
心判断的,如果是从内存变量
中
取数据则...
STL
所有sort算法介绍
STL
中
排序算法汇总
工具平台和程序库
24,860
社区成员
27,333
社区内容
发帖
与我相关
我的任务
工具平台和程序库
C/C++ 工具平台和程序库
复制链接
扫一扫
分享
社区描述
C/C++ 工具平台和程序库
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章