2016-04-27 43 views
1

初始化priority_queue最快的方式,可以在construction of a priority queue,選項(12)說:什麼是從unordered_set

template< class InputIt > 
priority_queue(InputIt first, InputIt last, 
       const Compare& compare = Compare(), 
       Container&& cont = Container()); 

但我不知道怎麼OT使用。 我有一個非空的std::unordered_set<std::shared_ptr<MyStruct>> mySet,我想將它轉換爲優先級隊列。我也創建了一個比較結構MyComparator

struct MyComparator { 
    bool operator()(const std::shared_ptr<myStruct>& a, 
        const std::shared_ptr<myStruct>& b){...} 
}; 

現在我怎麼能以更好的方式構建新的priority_queue myQueue?我用下面的,它的工作原理:

std::priority_queue<std::shared_ptr<MyStruct>, std::deque<std::shared_ptr<MyStruct>, MyComparator> 
    myQueue(mySet.begin(), mySet.end()); 

我既爲基準向量和雙端隊列,我覺得雙端隊列將跑贏矢量當尺寸比較大(〜30K)。 由於我們已經知道mySet的大小,因此我應該創建具有該大小的雙端機。但是我怎麼能用我自己的比較器和預定義的deque來創建這個priority_queue,比如myDeque

+0

你打算在事後插入更多的元素到優先級隊列中嗎? –

+0

是的,算法會彈出最重的一個,檢查其狀態,並可能添加更多與最重的相關的對象。這種插入可能會發生很多次(大約是原始大小的一半)。 –

回答

1

既然你已經確定std::deque爲您提供了更好的性能比std::vector,我不認爲還有更多你可以做你如何構建priority_queue的條款。正如您可能已經看到的那樣,沒有std::deque::reserve()方法,所以根本無法創建一個提前分配內存的雙端隊列。對於大多數使用情況來說,這不是問題,因爲deque vs vector的主要特點是deque在插入新元素時不需要複製元素。如果你仍然沒有達到你想要的性能,你可能會考慮存儲原始指針(保持你的智能指針在外面存活),或者簡單地將unordered_map更改爲常規map,並依賴容器提供的順序。