我有一個最小優先級隊列向量,每個隊列都使用自定義比較器類的不同實例創建。隊列的大小應該是有限的,並且在隊列已滿的情況下,只能插入比隊列頂部更高優先級的元素,並將元素頂出。因此,在插入完整隊列之前,我想使用隊列自己的比較器比較新元素和隊列頂部,以避免插入/刪除成本。有可能不重新創建比較器嗎?容器訪問比較器(C++/STL)
編輯: @ Kerrek的破解真的很酷,但比較器必須由帶參數的構造函數創建,我應該提到這一點。所以我用@Spundun答案去了,我也使用底層容器來加快打印速度。
我有一個最小優先級隊列向量,每個隊列都使用自定義比較器類的不同實例創建。隊列的大小應該是有限的,並且在隊列已滿的情況下,只能插入比隊列頂部更高優先級的元素,並將元素頂出。因此,在插入完整隊列之前,我想使用隊列自己的比較器比較新元素和隊列頂部,以避免插入/刪除成本。有可能不重新創建比較器嗎?容器訪問比較器(C++/STL)
編輯: @ Kerrek的破解真的很酷,但比較器必須由帶參數的構造函數創建,我應該提到這一點。所以我用@Spundun答案去了,我也使用底層容器來加快打印速度。
比較是受保護的成員(名爲補償,+1內特)。因此,如果你從stl類派生你自己的優先級隊列類,並實現你描述的功能(比如說insert_only_if_important()),那麼你可以從該函數內訪問比較器。
...名爲'comp'。 –
哇,它們是由標準定義爲「受保護」......這是令人驚訝的... –
它看起來像比較對象沒有暴露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
}
你是指'container :: key_compare()'?而且'std :: queue <>'沒有任何意義,無論如何,我認爲你的意思是'std :: priority_queue <>'不是嗎? –
WhozCraig
@KerrekSB是的,它是我見過的大多數情況下的成員('comp'),我認爲你是對的,至少我從來沒有見過它是公開的,我不認爲標準要求它是所以無論如何。編輯:只是檢查,它在標準的保護。 – WhozCraig
是的,@WhozCraig,你說得對,它是一個'std :: priority_queue'。 –