2014-10-17 85 views
0

我已經在一些奇怪的使用priority_queue的迷迷糊糊的,我很想獲得爲什麼地球上它的plausibile /有效的priority_queue聲明中使用這樣的一些適當的解釋:Priority_queue仿函數使用C++

typedef priority_queue<RandomContainer, **vector<RandomContainer>**, FunctorName> NewQueueName; 

讓我們說,我們已經得到了一些結構稱爲SPerson:

struct SPerson 
{ 
    int age; 
    string name; 
    string surname; 
}; 

和一些仿函數,這將有助於隊列中的所有元素進行排序因此我們likeing:

struct TheWayILike 
{ 
    bool operator()(const SPerson &name1, const SPerson &name2) 
    { 
     if(name1.name > name2.name) return true; 
     if(name1.name < name2.name) return false; 

     return false; 
    } 
}; 

現在我們可以聲明我們的priority_queue,它將基於結構中的元素,並將由函數稱爲TheWayILike的函數排序。

priority_queue<SPerson, TheWayILike> 

,或者使用的typedef和單名像這樣短的方式:

typedef priority_queue<SPerson, TheyWayILike> newNameForPQ; 

但不知何故,這是錯的,我必須添加以下行:矢量

問:

爲什麼我必須將我個人定製的數據類型變成矢量?

爲什麼它必須是一個矢量,爲什麼要用它呢?

爲什麼我需要將我的數據填充到矢量中?我沒有在官方的priority_queue文檔中閱讀過它,所以我很樂意爲菜鳥程序員獲得一些易於理解的解釋。

乾杯!

+0

'Container'只是一個模板參數。它告訴'priority_queue'在內部使用什麼,你不必提供這個容器的一個實例!換句話說,像下面這樣創建你的隊列:'priority_queue ,TheWayILike> myPQ'並將你的SPerson元素放入它中:'myPQ.push(a); myPQ.push(b)中; ...' – 2014-10-17 20:10:37

回答

3

你不需要。但看看priority_queue類模板聲明:

template< 
    class T, 
    class Container = std::vector<T>, 
    class Compare = std::less<typename Container::value_type> 
> class priority_queue; 

不能提供自定義比較類型參數,除非您還提供底層容器來保存數據線的筆者上述決定vector是最佳選擇。任何符合要求的其他容器也可以使用,例如, deque,但vector證明對於大多數應用程序來說是最好的,所以它是默認值。

+0

具體來說,容器需要完成一個特定的API並支持隨機訪問迭代器,而''vector'''''deque''都是這樣做的。 – aruisdante 2014-10-17 19:52:55

+0

所以基本上我不能只使用基本結構,作爲將在priority_queue中使用的容器,但在使用priority_queue之前,我必須重新分配/複製結構中的所有數據到vector,deque或任何其他容器?是對的嗎 ? – 2014-10-17 20:01:45

+0

如果你想使用上面那行的'priority_queue'類型,那麼是的。如果你可以使用你自己的「priority_queue」特化,並且你的容器滿足要求,你可以讓它使用你的容器類型並將你的容器對象移動到'priority_queue'中。 – Columbo 2014-10-17 20:06:50