2016-05-30 75 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)'。 –

相關問題