这段代码是如何工作的?具体来说,WorkerCompare 结构 [关闭]
Posted
技术标签:
【中文标题】这段代码是如何工作的?具体来说,WorkerCompare 结构 [关闭]【英文标题】:How does this code work? Specifically, the WorkerCompare struct [closed] 【发布时间】:2021-06-20 23:19:29 【问题描述】:(对不起,如果这个问题听起来含糊不清。如果需要,我会添加更多信息。)
程序的任务是模拟并行处理。我在互联网上找到的一个解决方案包含这个有效的代码,但我不知道如何。具体来说,为什么以及如何使用WorkerCompare
:
class Worker
public:
int id;
long long nextFreeTime;
Worker (int id)
this->id = id;
nextFreeTime = 0;
;
struct WorkerCompare
bool operator()(const Worker &w1, const Worker &w2) const
if(w1.nextFreeTime == w2.nextFreeTime)
return w1.id > w2.id;
else
return w1.nextFreeTime > w2.nextFreeTime;
;
这段代码主要用在这个函数中:
void AssignJobs()
assigned_workers_.resize(jobs_.size());
start_times_.resize(jobs_.size());
priority_queue<Worker, vector<Worker>, WorkerCompare> pq;
for(int i = 0; i < num_workers_; i++)
pq.push(Worker(i));
for (int i = 0; i < jobs_.size(); i++)
Worker freeThread = pq.top();
pq.pop();
assigned_workers_[i] = freeThread.id;
start_times_[i] = freeThread.nextFreeTime;
freeThread.nextFreeTime += jobs_[i];
pq.push(freeThread);
它将元素添加到向量assigned_workers_
和start_times_
,其中列出了用于执行进程的线程以及进程开始的时间。
完整源码可见here。
【问题讨论】:
您应该在使用类之前阅读文档:en.cppreference.com/w/cpp/container/priority_queue。这是每个 C++ 程序员都应该知道的非常基础的知识。我强烈建议您阅读一些 C++ 书籍。 【参考方案1】:priority_queue<Worker, vector<Worker>, WorkerCompare> pq;
我假设这是标准库中的std::priority_queue
。
优先队列通过比较元素来工作。这就是WorkerCompare
的用途。它比较 Worker
类型的对象。
【讨论】:
所以,如果我理解正确的话,pq
有一个类型 Worker
,如第一个参数所示,pq.push(Worker(i));
向vector<Worker>
添加一个元素,如第二个参数所示,WorkerCompare
保持队列井井有条。对吗?
@CarlEricDormal vector<Worker>
是队列用于内部存储的容器类型。但是,是的,差不多就是这样。另请参阅:***.com/q/388242/2079303以上是关于这段代码是如何工作的?具体来说,WorkerCompare 结构 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章