为什么这个自定义比较器在构造std :: priority_queue时失败,而它适用于std :: sort?

ced*_*usx 4 c++

比较器comp定义如下.它工作正常std::sort,但无法在构造函数中编译std::priority_queue.问题是什么?谢谢.

#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

bool comp(int a, int b) { return a > b; }

int main()
{
    vector<int> vec = {4, 2, 1, 3};
    sort(vec.begin(), vec.end(), comp); // OK
    priority_queue<int> q1(less<int>(), vec); // OK
    priority_queue<int> q2(comp, vec); // Fail
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误信息:

error: no matching function for call to 'std::priority_queue<int>::priority_queue(bool (&)(int, int), std::vector<int>&)'
  priority_queue<int> q2(comp, vec);
                                  ^
Run Code Online (Sandbox Code Playgroud)

Die*_*ühl 7

该类型的默认比较的std::priority_queuestd::less<T>,其中T是的值类型.你正在传递一些类型的东西bool(*)(int, int).std::sort()作为一个函数可以推导出比较器的类型.类类型不能推断出它们的模板参数(但是 - 我们在C++委员会中讨论了未来的版本可能有类模板,其模板参数可以推导出来.

您可以使用

std::priority_queue<int, std::vector<int>, bool(*)(int, int)> q(comp);
Run Code Online (Sandbox Code Playgroud)

或者,避免难以内联的函数指针:

std::priority_queue<int, std::vector<int>, std::greater<int> > q;
Run Code Online (Sandbox Code Playgroud)