我有两个与函数对象和函数指针有关的问题,
问题: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()
实例化要传递给PopLess
的std::sort()
类的临时实例。它实际上与您要说的相同(请注意,在此示例中,将制作一个额外的拷贝):
PopLess pl = PopLess();
sort(union, union + 60, pl);
然后,
std::sort()
将在该实例上调用operator()
。至于函数对象还是函数指针更好“更好”,这取决于。可能最重要的区别是,函数对象可以维护状态,而指针传递的普通函数则不能。编译器也许可以更好地优化彼此,但是在大多数使用情况下,这可能并不重要。
关于c++ - 函数对象与函数指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3002433/