2010-11-15 146 views
4

我想要自定義排序的優先級隊列,但因爲我很懶,所以我不想定義一個實現operator()的比較器類。std :: priority_queue:不定義比較器類的自定義排序

我真的想這樣的編譯:

std::priority_queue<int, std::vector<int>, 
    boost::bind(some_function, _1, _2, obj1, obj2)> queue; 

其中some_function是一個布爾返回函數需要四個參數,隊列的第一個和第二個是整數,這兩個最後的一些物品需要用於計算排序(常量引用)。

(error: ‘boost::bind’ cannot appear in a constant-expression)

但是這不能編譯。即使更簡單

std::priority_queue<int, std::vector<int>, &compare> queue; 

不會編譯,比較是一個返回布爾值的二進制函數。

(error: type/value mismatch at argument 3 in template parameter list for ‘template class std::priority_queue’; expected a type, got ‘compare’)

有什麼建議嗎?

+0

在這裏'boost :: bind'上沒有關閉paren - 在隊列模板參數>之前。這是發佈代碼中的錯字還是您嘗試編譯的內容? – 2010-11-15 16:48:19

回答

11

這可能工作:

std::priority_queue<int, std::vector<int>, 
    boost::function<bool(int,int)> > 

然後在你的綁定表達式到隊列的構造函數傳遞。

P.S.你會得到那些編譯錯誤,因爲你在運行時評估的表達式中需要一個類型名或常量表達式。

+3

+1,這是一個很好的解決方案。不幸的是,這與靜態提供特定模板函數/函數參數不完全相同,因爲'boost :: function'使用動態分配來創建可變函數對象。因此,您將不會獲得與使用靜態提供的自定義函數參數相同的編譯器生成的內聯效率。 – 2010-11-15 16:51:44

+0

@Charles:這很好。 – 2010-11-15 17:06:05

相關問題