【问题标题】:functor and function at priority_queue and sort of C++priority_queue 的仿函数和函数以及某种 C++
【发布时间】:2020-08-16 09:30:47
【问题描述】:

我尝试了解 C++ 中仿函数和函数的使用

请看下面的代码

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

bool mySort(int a, int b){
    if(a > b) return true;
    return false;
}

class myClass{

public:
    bool operator()(int a, int b){
        if(a>b) return true;
        return false;
    }
};

int main(){

    //(1) priority_queue<int, vector<int>, greater<int>> aa;
    //(2) priority_queue<int, vector<int>, greater<int>()> bb;
    //(3) priority_queue<int, vector<int>, myClass> cc;
    //(4) priority_queue<int, vector<int>, mySort> dd;

    vector<int> check={1,2,3,4,5,6,7};

    //(a) sort(check.begin(), check.end(), mySort);
    //(b) sort(check.begin(), check.end(), myClass);
    //(c) sort(check.begin(), check.end(), myClass());


    return 0;
}

我发现只有 (1),(3) 和 (a),(c) 有效。

使用sort和priority_queue时function和functor有什么区别?

我知道仿函数可以保持其状态,但在这种情况下,此信息不相关。

我也查了sortpriority_queue,但没看懂。

你能帮帮我吗?

【问题讨论】:

  • 不是错误,但 return a &gt; b; 是您在这些功能中所需要的。
  • mySort 不是排序,而是比较
  • greater&lt;int&gt; 是一个类型,greater&lt;int&gt;() 是一个函数类型(函数不接受返回 greater&lt;int&gt; 的参数)或实例,具体取决于上下文。所以区别主要在int,int(),42之间。
  • 提示:using namespace std; 是一个不好养成的习惯,如果你现在可以停下来,将来可能会避免很多麻烦。 std:: 前缀的存在是有原因的:它避免与您自己的类、结构和变量发生冲突。
  • @tadman 你的话很有帮助,因为我是新手。非常感谢!

标签: c++ function templates functor


【解决方案1】:

实例化priority_queue时,第三个参数必须是类型。
greater&lt;int&gt;myClass是类型; greater&lt;int&gt;()mySort 不是。
如果您创建默认的priority_queue,它将默认初始化指定类型的排序。

priority_queue<int, vector<int>, greater<int>> aa;

等价于

priority_queue<int, vector<int>, greater<int>> aa(greater<int>());

priority_queue<int, vector<int>, myClass> cc;

等价于

priority_queue<int, vector<int>, myClass> cc(myClass());

当你调用sort时,你给它一个可调用对象作为第三个参数,模板参数是从函数参数推导出来的。
mySortmyClass()是可调用对象;它们的类型分别是bool(int,int)myClass,这些类型成为模板参数。
myClass 是一个类型,不能用作函数参数。

sort(check.begin(), check.end(), mySort);

等价于

sort<vector<int>::iterator, bool(int,int)>(check.begin(), check.end(), mySort);

sort(check.begin(), check.end(), myClass());

等价于

sort<vector<int>::iterator, myClass>(check.begin(), check.end(), myClass());

【讨论】:

  • 我完全明白!非常感谢!!
  • greater&lt;int&gt;() 可能是一个(函数)类型,priority_queue&lt;int, vector&lt;int&gt;, greater&lt;int&gt;&gt; aa(greater&lt;int&gt;()); 也是最令人头疼的解析。
  • mySort 衰减为指针,所以bool (*) (int, int)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 2018-07-07
  • 2022-10-19
相关资源
最近更新 更多