2012-04-23 25 views
3

スレッドオブジェクトを保持するのに最適なSTLコンテナを選択しようとしています(スレッドライブラリを作成しています)。私の問題は、私がそれらのどれにもあまりよく慣れていないことです。また、APIヘルプを読んでいる間に、それを以前使っていた人に相談したいと思います。スレッドを格納するためのSTLコンテナの選択

とにかく - Threadオブジェクトには、2つの重要な属性があります:_id_priorityです。 私は_idでスレッドにアクセスできる必要があるので、私は自然にhash_mapを考えました。私はまた、_priority(別のスレッドオブジェクトは同じ優先順位を持つことができる)でソートされるオブジェクトをしたいので、私は、hash_mapへのポインタで優先順位キューを考えたが、私はキューに最初ではないスレッドを削除する醜い。

もっと良い解決策はありますか?ありがとう!

+0

2つの異なる用途、特定のスレッドを検索する場所、特定の順序ですべてをループする場所がありますか? –

答えて

0

ベストソリューションはおそらくstd::mapで、キーと値のペアを提供します。あなたのシナリオでは、キーのタイプは_idで、タイプはThread(これはあなたのクラスの名前であると仮定します)です。すべての値をstd::vectorにコピーすると、_prioritystd::sortと述語でソートできます。

0

簡単な解決策は、std::unordered_mapにキー→スレッドルックアップを提供し、次にstd::setを使用して優先順位キューを実装することです。

+1

Eh?なぜdownvote? – Hurkyl

4

2種類のアクセスを取得するには、2つのコンテナを組み合わせるか、コンテナを組み合わせたライブラリを再利用する必要があります。

Boost.MultiIndex正確にこの種のニーズが発明されました。

basics pageには、従業員がid(ユニーク)でアクセス可能で、名前でソートされている(一意でない)例があります。

鍵エクストラクタはおそらく明らかではありません。あなたが書くことができるはず

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

    ... 
}; 

:一意にid()によって識別され、そのpriority()に従ってソートスレッドのコンテナを定義し

#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; 

あなたのスレッドressembleとすると。

さまざまなインデックスで遊ぶことをお勧めします。また、クラスへのフレンドアクセスや、可変参照を返す特定のgetterを提供する場合は、const_mem_funの代わりにmem_funを使用すると、オブジェクトを適切に更新(たとえば、優先度の変更など)することができます。

非常に完全な(難しい場合は)ライブラリです。