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