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

时间:2016-05-30 10:19:05

标签: 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;
}

错误讯息:

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);
                                  ^

1 个答案:

答案 0 :(得分:7)

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

您可以使用

std::priority_queue<int, std::vector<int>, bool(*)(int, int)> q(comp);

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

std::priority_queue<int, std::vector<int>, std::greater<int> > q;