这段代码是如何工作的?具体来说,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&lt;Worker&gt; 添加一个元素,如第二个参数所示,WorkerCompare 保持队列井井有条。对吗? @CarlEricDormal vector&lt;Worker&gt; 是队列用于内部存储的容器类型。但是,是的,差不多就是这样。另请参阅:***.com/q/388242/2079303

以上是关于这段代码是如何工作的?具体来说,WorkerCompare 结构 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

这段代码是如何工作的? (GDI,C#)

这段代码是如何工作的?

谁能解释这段代码是如何工作的?

在 Scala 中计算素数:这段代码是如何工作的?

这段代码中的“继续”是如何工作的?

这段混淆的 Haskell 代码是如何工作的?