C++事件驱动型银行排队模拟

2020-01-06 15:56:43刘景俊

(2)比较直观且简单的做法是自定义用于比较的函数对象:


 //声明使用EventComp作为比较函数的优先队列
std::priority_queue<Event, std::vector<Event>, EventComp> _event_queue; struct EventComp
{
 bool operator()(const Event& lhs, const Event& rhs) const
 {
  return lhs.occur_time > rhs.occur_time;//occur_time是公有的,若是私有的,则需要提供接口
 }
}; 

可以在test.h中通过USE_SELF_DEFINE_QUEUE宏来切换2种队列的使用。 

事件队列的顺序 

事件队列要求队首总是发生时间最早的事件,最小堆是非常好的选择,通过前面介绍的STL优先队列可以轻松实现。自定义的队列则使用的是蛮力法,在事件入队时就进行排序,保证队列是以发生时间升序的,在队列中元素较多时(如几百个),效率是低于使用STL优先队列的方法的,这也是为何要分批生成顾客到达事件的原因之一:防止事件队列的元素过多。
 顾客队列是不需要排序的,所以以模板特例化的方式实现了事件队列的入队方法:
 template<>


void Queue<Event>::enqueue(Event* event) {

 Event *cur = _front, *prev = nullptr;

 while (cur != nullptr) {
  if (cur->occur_time < event->occur_time) {
   prev = cur;
   cur = cur->next;
  }
  else
   break;
 }

 if (prev == nullptr) {
  event->next = _front;
  _front = event;
  if (_rear == nullptr)
   _rear = event;//_rear is useless to Event queue
 }
 else {
  event->next = prev->next;
  prev->next = event;
  if (prev == _rear)
   _rear = event;
 }
 ++length;
} 

完整代码在这里。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持ASPKU。


注:相关教程知识阅读请移步到C++教程频道。