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% 的一部分? :-) @paxdiablo1 second < 2 seconds
... 这是有道理的。 event1 < event2
可能意味着任何东西...... Event
没有任何意义,这意味着它可能意味着什么。如果你定义一个operator<
,除了奇怪的情况外,其他5个比较运算符几乎总是有意义的。在这种情况下,您只创建一个operator<
以满足容器中的排序,告诉容器“根据他们的时间对我的Event
s 进行排序”会更加清晰和正确......(通过使用自定义比较器)
@Dave,如果一个事件是一个时间点,那是完全合理的。在一段时间内没有这么多,因为应该使用 哪个 时间点并不是那么明显,但我认为这里不是这种情况,事件类型显然是时间点对象。即使是持续时间,我也可能(作为个人喜好)使用封装比较并记录它们的含义,但我可以看到你来自哪里。
@paxdiablo 我没注意这里,我没有意识到这是 那个 类型的事件(我在想消息类型,并没有费心阅读) .所以,我认为这对这种情况是有意义的。虽然我仍然会定义其他 5 个运算符。【参考方案2】:
由于您没有指定 Compare
模板参数,因此您必须在 Event 结构中声明 operator<
。队列如何知道要提取的最小元素是什么?
【讨论】:
以上是关于C++ 我在设置我创建的类的优先级队列时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章