3

Thread オブジェクトを保持するのに最適な STL コンテナーを選択しようとしています (スレッド ライブラリを作成しています)。私の問題は、私がそれらのどれにもあまり精通していないことです.APIを読むことは役に立ちますが、以前にそれを使用したことがある人に相談したいと思います.

とにかく - すべてのThreadオブジェクトには 2 つの重要な属性があります:_id_priority. でスレッドにアクセスできるようにする必要がある_idので、hash_map を自然に思いつきました。また、オブジェクトをソートしたい_priority(異なる Thread オブジェクトが同じ優先度を持つことができる) ため、hash_map へのポインターを持つ優先キューを考えましたが、キューの最初ではないスレッドを削除すると、少し見苦しくなります。 .

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

4

3 に答える 3

4

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

Boost.MultiIndexは、まさにこの種のニーズのために考案されました。

基本ページには、従業員が ID (一意) でアクセス可能で、名前 (一意でない) でソートされている例が示されています。

キー エクストラクタは、おそらく明らかではありません。あなたのスレッドが似ていると仮定すると:

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()their によって一意に識別され、 theirに従ってソートされたスレッドのコンテナーを定義しpriority()ます。

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

これは非常に完全な (気が遠くなるような) ライブラリです。

于 2012-04-23T07:23:16.400 に答える
0

最善の解決策はstd::map、キーと値のペアを提供することです。あなたのシナリオでは、キーにはあなたのタイプが_idあり、値にはタイプがありますThread(これがあなたのクラスの名前であると仮定します)。すべての値を a にコピーすると、述語でstd::vector並べ替えることができます。_prioritystd::sort

于 2012-04-23T07:08:14.510 に答える
0

簡単な解決策はstd::unordered_map、 キーを提供するために を保持することです --> スレッド ルックアップを使用し、次に を使用しstd::setてプライオリティ キューを実装します。

于 2012-04-23T07:13:23.803 に答える