选择STL容器来存储线程

时间:2012-04-23 06:58:26

标签: c++ containers

我正在尝试选择最好的STL容器来保存Thread对象(我正在编写一个线程库)。我的问题是我对它们中的任何一个都不是很熟悉,在阅读api有帮助的时候,我想咨询之前使用它的人。

无论如何 - 每个Thread对象都有两个重要属性:_id_priority。 我需要能够通过_id访问一个线程,所以我自然会想到一个hash_map。我也希望对象按_priority排序(不同的Thread对象可以具有相同的优先级),所以我想到了一个带有指向hash_map的指针的优先级队列,但是如果我删除了一个不在队列中的第一个线程它变得有点难看。

有更好的解决方案吗?谢谢!

3 个答案:

答案 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,您可以按_prioritystd::sort和谓词进行排序。

答案 2 :(得分:0)

一个简单的解决方案是保持std::unordered_map提供密钥 - &gt;线程查找,然后使用std::set来实现您的优先级队列。