![](/img/trans.png)
[英]priority_queue with custom comparator returning wrong top-of-the-heap
[英]Returning a priority_queue with custom comparator
我有一個需要根據某些輸入參數返回排序列表的函數。 我選擇了一個std::priority_queue
來保存此列表。
但是編譯器給了我一個我不認識的錯誤。 這是我的代碼:
struct DepthCompare {
bool operator()
(const struct inst *&lhs, const struct inst *&rhs) const
{
return lhs->depth < rhs->depth;
}
};
typedef priority_queue<struct inst*> HeuristicList;
HeuristicList getHeuristicList(struct BasicBlock &) {
HeuristicList ret( DepthCompare );
return ret;
}
編譯器說,在返回語句的行上conversion from 'HeuristicList (*)(DepthCompare)' to non-scalar type 'HeuristicList' requested
。
看起來我沒有嘗試返回指針。 怎么了
你有兩個問題。
要使用自定義比較器,必須將比較器類型指定為第三個模板參數:
typedef priority_queue<inst*, vector<inst*>, DepthCompare> HeuristicList;
HeuristicList ret( DepthCompare );
被解釋為函數聲明,而不是變量聲明,給出您所看到的錯誤。 您需要傳遞比較器的實例,並確保不能將其解釋為函數聲明:
HeuristicList ret = HeuristicList(DepthCompare());
但是,由於構造函數的第一個參數是可選的,並且默認為默認構造的比較器,因此您可以簡單地編寫
HeuristicList ret;
或者,由於您只是立即返回變量,
return HeuristicList();
注意,比較器是priority_queue
的第三個模板參數。 您必須像這樣聲明您的priority_queue
:
typedef priority_queue<inst*, vector<inst*>, DepthCompare> HeuristicList;
假設您要使用vector
作為后備容器(默認)。
還要注意,在比較器函子中,您想將參數聲明為對指針的const引用。 您所擁有的是對指向const的指針的引用。 你要這個:
bool operator()(inst* const& lhs, inst* const& rhs) const
您也不需要將比較器對象的實例傳遞給priority_queue
構造函數,因為默認的比較器構造函數就可以了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.