C++ 我在设置我创建的类的优先级队列时遇到问题

Posted

技术标签:

【中文标题】C++ 我在设置我创建的类的优先级队列时遇到问题【英文标题】:C++ I'm having trouble setting up a priority queue of a class I created 【发布时间】:2013-05-01 02:32:07 【问题描述】:

我正在尝试为我创建的名为 Event 的类设置优先级队列。在我尝试此操作之前的 2 行中,我设置了 2 个其他优先级队列,它们似乎工作正常,但在第 3 行出现错误。有什么建议吗?

class Event
    enum eventType  Arrival, CPUburstCompletion, IOcompletion, TimerExpired ;
    double time; // Defined as time units since the start of the simulation
;

vector<process> processTable;
int CPU;
int IO;
priority_queue< int, vector<int> > readyQueue;
priority_queue< int, vector<int> > IO_Queue;
priority_queue< Event, vector<Event> > eventQueue;

我的 Event 类中没有比较器功能。我把它放进去,但我仍然得到一个错误。我没有正确写比较器吗?

class Event
    enum eventType  Arrival, CPUburstCompletion, IOcompletion, TimerExpired ;
    double time; // Defined as time units since the start of the simulation
    bool operator()(Event& e1, Event& e2)
        if (e1.time < e2.time)
            return true;
        
        else
            return false;
        
    
;

vector<process> processTable;
int CPU;
int IO;
priority_queue< int, vector<int> > readyQueue;
priority_queue< int, vector<int> > IO_Queue;
priority_queue< Event, vector<Event> > eventQueue;

【问题讨论】:

你得到什么错误? 【参考方案1】:

您需要在 Event 类中定义一个比较运算符,或者作为优先级队列的模板参数。

class Event
 ...
  public: 
     bool operator<(const Event &other) const return time < other.time;
;

【讨论】:

注意:这基本上几乎没有意义。 97.2% 的情况下,您应该制作自定义比较器,而不是这样做。 @怎么样,@Dave?这似乎很有意义,并且遵守封装规则——一个对象是否小于另一个对象是类的属性,而不是某个外部函数,对吗?或者这部分是另外 2.8% 的一部分? :-) @paxdiablo 1 second &lt; 2 seconds... 这是有道理的。 event1 &lt; event2 可能意味着任何东西...... Event 没有任何意义,这意味着它可能意味着什么。如果你定义一个operator&lt;,除了奇怪的情况外,其他5个比较运算符几乎总是有意义的。在这种情况下,您只创建一个operator&lt; 以满足容器中的排序,告诉容器“根据他们的时间对我的Events 进行排序”会更加清晰和正确......(通过使用自定义比较器) @Dave,如果一个事件是一个时间点,那是完全合理的。在一段时间内没有这么多,因为应该使用 哪个 时间点并不是那么明显,但我认为这里不是这种情况,事件类型显然是时间点对象。即使是持续时间,我也可能(作为个人喜好)使用封装比较并记录它们的含义,但我可以看到你来自哪里。 @paxdiablo 我没注意这里,我没有意识到这是 那个 类型的事件(我在想消息类型,并没有费心阅读) .所以,我认为这对这种情况是有意义的。虽然我仍然会定义其他 5 个运算符。【参考方案2】:

由于您没有指定 Compare 模板参数,因此您必须在 Event 结构中声明 operator&lt;。队列如何知道要提取的最小元素是什么?

【讨论】:

以上是关于C++ 我在设置我创建的类的优先级队列时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥在c++中实现基于类的优先级队列时需要重载operator<?

C++ 对象指针的优先级队列在运行时错误为无效堆

用C++的类做三种优先队列的实现

C++ 优先级队列交换内容

在 C++ OpenMP 中为每个线程定义一个优先级队列

c++ 当我创建结构数组时,如何使用结构数组内的类的参数调用构造函数?