2013-01-10 63 views
2

我有一個最小優先級隊列向量,每個隊列都使用自定義比較器類的不同實例創建。隊列的大小應該是有限的,並且在隊列已滿的情況下,只能插入比隊列頂部更高優先級的元素,並將元素頂出。因此,在插入完整隊列之前,我想使用隊列自己的比較器比較新元素和隊列頂部,以避免插入/刪除成本。有可能不重新創建比較器嗎?容器訪問比較器(C++/STL)

編輯: @ Kerrek的破解真的很酷,但比較器必須由帶參數的構造函數創建,我應該提到這一點。所以我用@Spundun答案去了,我也使用底層容器來加快打印速度。

+0

你是指'container :: key_compare()'?而且'std :: queue <>'沒有任何意義,無論如何,我認爲你的意思是'std :: priority_queue <>'不是嗎? – WhozCraig

+0

@KerrekSB是的,它是我見過的大多數情況下的成員('comp'),我認爲你是對的,至少我從來沒有見過它是公開的,我不認爲標準要求它是所以無論如何。編輯:只是檢查,它在標準的保護。 – WhozCraig

+0

是的,@WhozCraig,你說得對,它是一個'std :: priority_queue'。 –

回答

1

比較是受保護的成員(名爲補償,+1內特)。因此,如果你從stl類派生你自己的優先級隊列類,並實現你描述的功能(比如說insert_only_if_important()),那麼你可以從該函數內訪問比較器。

+2

...名爲'comp'。 –

+1

哇,它們是由標準定義爲「受保護」......這是令人驚訝的... –

4

它看起來像比較對象沒有暴露std::priority_queue,甚至沒有它的類型。作爲一個骯髒的黑客,並根據該比較器是無狀態的默認constructible的假設,你可以嘗試這樣的事:

template <typename> struct kidnap_comparator; 

template <typename T, typename Cnt, typename Cmp> 
struct kidnap_comparator<std::priority_queue<T, Cnt, Cmp>> 
{ 
    typedef Cmp type; 
}; 


// ... 

template <typename PQ> 
void insert_maybe(PQ & pq, typename PQ::const_reference x) 
{ 
    typename kidnap_comparator<PQ>::type cmp; 

    // use "cmp" to compare pq.top() and x 
} 
+0

+1,只是有點髒= P – WhozCraig

+0

這將「創建」一個新的比較器,我不知道這是OP的想法 – Spundun

+0

在C++ 11中,你也可以在比較器周圍使用'reference_wrapper'來保存 – pmr