这两段代码做同样的事情。如您所见,它将用于排序功能。 哪个更好?我通常写后一种。但我看到一些编码员像以前那样做。
struct val_lessthan : binary_function<pair<string,int>, pair<string, int>, bool>
{
bool operator() (const pair<string,int>& x, const pair<string,int>& y) const
{
return x.second < y.second;
}
} val_lt;
和
bool val_lt(const pair<string,int>& x, const pair<string,int>& y)
{
return x.second < y.second;
}
将像这样使用它:
std::sort(wordvector.begin(), wordvector.end(), val_lt);
最佳答案
您看到有些人喜欢第一个版本的原因是仿函数可以简单地内联。
当您将仿函数传递给 std::sort
时,函数知道仿函数类型,因此在编译时也知道要调用的确切函数,并且可以简单地内联。
对于普通函数,std::sort
真正看到的只是一个函数指针,并且在编译时没有说明它指向的哪个函数。因此,除非编译器执行一些相当广泛的流分析以查看指针来自在此特定调用中的何处,否则不能内联。它肯定会在像你这样的小例子中进行优化,但是如果仿函数/函数指针作为函数参数从其他地方传入,或者在传递给 std::sort
之前从中间数据结构中读取,那么,编译器可能无法内联函数指针版本,因此最终会变慢。
关于c++ - 我应该使用函数还是无状态仿函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5521898/