gpt4 book ai didi

c++ - 选择一个STL容器来存储线程

转载 作者:太空狗 更新时间:2023-10-29 21:05:19 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

Boost.MultiIndex正是为了这种需求而发明的。

basics page显示了一个示例,其中员工可以通过 ID(唯一)访问并按名称(非唯一)排序,这几乎就是您想要的。

key 提取器可能并不明显。假设您的线程组合:

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() 排序。

我鼓励您尝试使用各种索引。此外,如果您提供 friend 访问您的类或返回可变引用的特定 getter,则使用 mem_fun 而不是 const_mem_fun 您将能够就地更新您的对象(对于例如,更改他们的优先级)。

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

关于c++ - 选择一个STL容器来存储线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10276086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com