2015-09-30 50 views
1

我定義了一個priority_queue<pair<double, int>>。較小的double值具有較高的優先級。如果隊列中有多個相同的double值,則隨機彈出一個值。例如:(<0.1, 1>, <0.1,2>, <0.1, 0>,<0.1,5>),如何隨機彈出其中一個?我不確定我的想法是否合理。因爲元素的位置已經確定,當它被推入隊列時。如何比較priority_queue中的兩個元素

+1

由於您使用的是std :: pair,所以在對隊列中的元素進行排序時,也使用了pare的int成員部分 – NathanOliver

+1

您是否問如何在具有相同'double的元素中隨機選擇一個元素'價值?如果是這樣的話:因爲底層容器沒有公開,你可以用相同的'double'彈出這些值並選擇一個或者推出你自己的版本。不知道我明白你在問什麼 –

+0

計算機科學中的隊列非常類似於現實生活中的隊列,東西在一個和另一個之間進入。這意味着真的沒有辦法隨機訪問元素。 –

回答

2

如果「隨機」你的意思是它應該與double的最低值的所有項目中進行真正的(僞)隨機選擇,那麼這是不是std::priority_queue可以爲你做—它不是專爲。您最好的選擇是彈出並保存所有項目,同時優先級相同,然後隨機選擇一個,然後重新插入隊列。

如果,另一方面,你的意思是「隨機」,如「其中任何一個好」,那麼你可以簡單地做一個自定義比較這隻會考慮的的first數據成員的值對。當這些同意將取決於優先級隊列的內部實現(並且可能還有插入順序)時,哪一個被彈出。對於許多目的來說,這可能是「隨機」的。

在代碼中,第二個選項是這樣的:

struct DoublePriority 
{ 
    bool operator() (const std::pair<double, int> &lhs, const std:pair<double, int> &rhs) const { 
    return lhs.first > rhs.first; 
    } 
}; 

std::priority_queue<std::pair<double, int>, std::vector<std::pair<double, int>>, DoublePriority> theQueue; 
+0

我之前使用過這種方法。但是現在它總是選擇具有較大節點ID的對。我用這個計算最短路徑。如果我有相同的double值(到src的距離),但是來自不同的int(節點ID),我只想隨機選擇一個節點ID並相應地彈出該對。也許我應該改變我的方法,priority_queue不是爲此設計的。 – user2585677

2

你可以存儲元組double, int, int,其中最後一項是你比較器將用來解決相當的要素的比較獨特的隨機數。

+0

謝謝。我會嘗試。 – user2585677