我正在尝试选择最好的STL容器来保存Thread对象(我正在编写一个线程库)。我的问题是我对它们中的任何一个都不是很熟悉,在阅读api有帮助的时候,我想咨询之前使用它的人。
无论如何 - 每个Thread
对象都有两个重要属性:_id
和_priority
。
我需要能够通过_id
访问一个线程,所以我自然会想到一个hash_map。我也希望对象按_priority
排序(不同的Thread对象可以具有相同的优先级),所以我想到了一个带有指向hash_map的指针的优先级队列,但是如果我删除了一个不在队列中的第一个线程它变得有点难看。
有更好的解决方案吗?谢谢!
答案 0 :(得分:4)
要获得两种类型的访问权限,您需要组合两个容器...或者重用一个为您组合容器的库。
Boost.MultiIndex是为了满足这种需求而发明的。
basics page显示了一个示例,其中的员工可以通过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
您将能够更新您的对象(例如,更改其优先级)
这是一个非常完整(如果令人生畏)的图书馆。
答案 1 :(得分:0)
最佳解决方案可能是std::map
,为您提供键/值对。在您的方案中,密钥具有_id
的类型和类型Thread
的值(假设这是您的类的名称)。通过将所有值复制到std::vector
,您可以按_priority
与std::sort
和谓词进行排序。
答案 2 :(得分:0)
一个简单的解决方案是保持std::unordered_map
提供密钥 - &gt;线程查找,然后使用std::set
来实现您的优先级队列。