要获得两种类型的访问权限,您要么需要组合两个容器……要么重用一个为您组合容器的库。
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()
并根据它们排序的线程容器priority()
。
我鼓励您使用各种索引。此外,如果您为您的类或返回可变引用的特定 getter 提供朋友访问权限,那么使用mem_fun
代替const_mem_fun
您将能够就地更新您的对象(例如,更改它们的优先级)。
这是一个非常完整(如果令人生畏)的库。