2012-04-23 34 views
3

我想選擇最好的STL容器來容納線程對象(我正在寫一個線程庫)。我的問題是我對他們中的任何一個都不熟悉,並且在閱讀api的幫助時,我想諮詢曾經使用過它的人。選擇一個STL容器來存儲線程

無論如何 - 每個Thread對象都有兩個重要屬性:_id_priority。 我需要能夠通過_id訪問一個線程,所以我自然想到了一個hash_map。我也希望對象按_priority排序(不同的Thread對象可以具有相同的優先級),所以我想到了一個指向hash_map指針的優先級隊列,但是如果我刪除一個不在隊列中的線程,它會得到一些醜陋。

有沒有更好的解決方案?謝謝!

+0

你有兩種不同的用法,一種是你想查找某個特定的線程,另一種是你想要以特定的順序遍歷所有的東西? – 2012-04-23 07:13:35

回答

0

最好的解決方案可能是std::map,爲您提供一個鍵/值對。在你的情況下,密鑰的類型爲_id,值爲Thread(假設這是你班級的名字)。通過將所有值複製到std::vector,可以用_prioritystd::sort和謂詞進行排序。

0

一個簡單的解決方案是保持std::unordered_map提供密鑰 - >線程查找,然後使用std::set來實現您的優先級隊列。

+1

呃?爲什麼downvote? – Hurkyl 2012-04-23 07:43:26

4

要獲得兩種類型的訪問,您需要將兩個容器合併在一起......或重新使用爲您合併容器的庫。

Boost.MultiIndex是爲了這種需求而發明的。

basics page顯示了一個員工可通過id訪問(唯一)並按名稱(非唯一)進行訪問的示例,這非常符合您的需求。

關鍵提取器可能並不明顯。假設你的線程ressemble:

class Thread { 
public: 
    std::size_t id() const; 
    std::size_t priority() const; 

    ... 
}; 

你應該能夠編寫:

#include <boost/multi_index_container.hpp> 
#include <boost/multi_index/ordered_index.hpp> 
#include <boost/multi_index/const_mem_fun.hpp> 
#include <boost/multi_index/member.hpp> 

// define a multiply indexed set with indices by id and name 
typedef multi_index_container< 
    Thread, 
    indexed_by< 
     ordered_unique< 
      const_mem_fun<Thread, std::size_t, &Thread::id> 
     >, 
     ordered_non_unique< 
      const_mem_fun<Thread, std::size_t, &Thread::priority> 
     > 
    > 
> ThreadContainer; 

它定義了自己的id()唯一標識,並根據他們的priority()分揀線的容器。

我鼓勵你玩各種指標。此外,如果您向朋友提供訪問您的班級或特定獲得者返回可變引用的權限,則使用mem_fun而不是const_mem_fun,您將能夠更新您的對象(例如,更改其優先級)。

這是一個非常完整的(如果令人生畏的)庫。