3

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

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

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

4

3 回答 3

4

要获得两种类型的访问权限,您要么需要组合两个容器……要么重用一个为您组合容器的库。

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您将能够就地更新您的对象(例如,更改它们的优先级)。

这是一个非常完整(如果令人生畏)的库。

于 2012-04-23T07:23:16.400 回答
0

最好的解决方案可能是std::map,为您提供一个键/值对。在您的场景中,键具有您的类型_id和类型的值Thread(假设这是您的类的名称)。通过将所有值复制到 a ,您可以按with和谓词std::vector进行排序。_prioritystd::sort

于 2012-04-23T07:08:14.510 回答
0

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

于 2012-04-23T07:13:23.803 回答