2016-05-30 73 views
4

比较器comp定义如下。它工作正常,std::sort,但未能在std::priority_queue的构造函数中编译。问题是什么?谢谢。为什么这个自定义比较器在为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); 
           ^
+0

因为(http://de.cppreference.com/w/cpp/container/priority_queue)中的['的默认Compare'模板参数]是'STD: :less'你需要一个不同的模板实例化,而在'sort'中调用比较器类型pe自动推导出来。 – BeyelerStudios

回答

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; 
+0

对不起,我非常天真的问题 - 如何布尔(*)(int,int)'?是不是'comp()'的返回类型只是'bool'? –

+1

'(*)'是指向*函数的指针* – sp2danny

+1

进行比较的实体是一个对象。默认对象是'std :: less ()'。比较对象的对象与优先级队列一起存储(或传递给'std :: sort()')。当存储函数时,结果('bool')不足,需要表示要调用的函数的对象。对于具有'bool(int,int)'签名的函数,您可以使用一个指针,即'bool(*)(int,int)'。 –

相关问题