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
を使用すると、オブジェクトをその場で更新できます (たとえば、優先度を変更します)。
これは非常に完全な (気が遠くなるような) ライブラリです。