gpt4 book ai didi

c++ - 函数对象与函数指针

转载 作者:可可西里 更新时间:2023-11-01 15:46:01 24 4
gpt4 key购买 nike

我有两个关于函数对象和函数指针的问题,


问题:1

当我阅读STL的不同使用sort算法时,我看到第三个参数可以是一个函数对象,下面是一个例子

class State {  
public:
//...
int population() const;
float aveTempF() const;
//...
};
struct PopLess : public std::binary_function<State,State,bool> {
bool operator ()( const State &a, const State &b ) const
{ return popLess( a, b ); }
};
sort( union, union+50, PopLess() );

问题:

现在,sort(union, union+50,PopLess()) 语句是如何工作的? PopLess() 必须解析为类似 PopLess tempObject.operator() 的内容,这与在临时对象上执行 operator () 函数相同目的。我认为这是将重载操作的返回值即 bool(如我的示例)传递给 sort 算法。

那么,sort函数在这种情况下是如何解析第三个参数的呢?


问题:2

问题

相对于函数指针,我们是否得出使用函数对象的任何特殊优势?如果我们使用下面的函数指针,它会产生任何缺点吗?

inline bool popLess( const State &a, const State &b )
{ return a.population() < b.population(); }
std::sort( union, union+50, popLess ); // sort by population

PS : 以上引用资料(包括示例)均来自“Stephen C. Dewhurst”着的《C++ Common Knowledge: Essential Intermediate Programming》一书。
我无法解码主题内容,因此发帖求助。

预先感谢您的帮助。

最佳答案

PopLess() 实例化要传递给 std::sort() 的类 PopLess 的临时实例。它实际上与您要说的一样(请注意,在此示例中制作了一个额外的拷贝):

PopLess pl = PopLess();
sort(union, union + 60, pl);

然后,std::sort() 将调用该实例上的 operator()

至于函数对象和函数指针哪个更好“更好”,这要看情况。可能最重要的区别是函数对象可以保持状态,而通过指针传递的普通函数则不能。编译器可能能够更好地优化一个或另一个,但在大多数使用场景中这可能并不重要。

关于c++ - 函数对象与函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3002433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com