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

问题: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算法。

那么,在这种情况下,排序函数如何解析第三个参数?

问题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:基本中级编程”。
我无法解码主题内容,因此已发布以寻求帮助。

在此先感谢您的帮助。

最佳答案

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

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

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

至于函数对象还是函数指针更好“更好”,这取决于。可能最重要的区别是,函数对象可以维护状态,而指针传递的普通函数则不能。编译器也许可以更好地优化彼此,但是在大多数使用情况下,这可能并不重要。

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

10-12 03:49
查看更多