c++ - 我应该使用函数还是无状态仿函数?

标签 c++ function stl functor

这两段代码做同样的事情。如您所见,它将用于排序功能。 哪个更好?我通常写后一种。但我看到一些编码员像以前那样做。

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/

相关文章:

C++。如何使用 sregex_token_iterator 检测匹配和不匹配的部分?

c++ - 删除后将 C++ 指针初始化为零?

c++ - 高效的 float 到 int 且不会溢出

c# - 内存泄漏检测器

javascript - Canvas 随重力交替形状

python - 我有一个单词的 df,我想知道它们是否在英语词典中

c++ - C++ 中的指针函数参数复制和性能

c++ - 在构造函数定义中调用函数后收到 Segmentation Fault 11 错误?

c++ - std::vector::erase(iterator position) 不一定调用相应元素的析构函数

c++ - 在 STL 中使用返回索引进行二进制搜索?