C++ 选择STL容器来存储线程

C++ 选择STL容器来存储线程,c++,containers,C++,Containers,我正在尝试选择最好的STL容器来保存线程对象(我正在编写一个线程库)。我的问题是我对其中任何一个都不是很熟悉,在阅读api帮助的同时,我想咨询一下以前使用过它的人 无论如何-每个线程对象都有两个重要属性:\u id和\u priority。 我需要能够通过\u id访问线程,所以我自然想到了散列映射。我还希望对象按优先级排序(不同的线程对象可以具有相同的优先级),因此我想到了一个带有指向哈希映射的指针的优先级队列,但是如果我删除一个不是队列中第一个的线程,它会变得有点丑陋 有更好的解决办法吗?谢

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

无论如何-每个
线程
对象都有两个重要属性:
\u id
\u priority
。 我需要能够通过
\u id
访问线程,所以我自然想到了散列映射。我还希望对象按优先级排序(不同的线程对象可以具有相同的优先级),因此我想到了一个带有指向哈希映射的指针的优先级队列,但是如果我删除一个不是队列中第一个的线程,它会变得有点丑陋


有更好的解决办法吗?谢谢

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

一个简单的解决方案是保持
std::unordered\u映射
以提供键-->线程查找,然后使用
std::set
实现优先级队列。

要获得两种访问类型,您需要组合两个容器。。。或者重用为您组合容器的库

正是为了这种需要而发明的

下面的示例显示了一个可以按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和名称索引的多索引集
typedef多索引容器<
线
索引<
有序_唯一<
康斯特·梅姆·芬
>,
有序非唯一<
康斯特·梅姆·芬
>
> 
>螺纹容器;
它定义了一个线程容器,该容器由其
id()
唯一标识,并根据其
优先级()进行排序

我鼓励您使用各种索引。此外,如果您提供对类的友元访问或返回可变引用的特定getter,则使用
mem\u-fun
而不是
const\u-mem\u-fun
可以就地更新对象(例如,更改其优先级)


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

您有两种不同的用法,一种是查找特定线程,另一种是按特定顺序循环所有内容吗?