实现一个优先级消息队列。
不妨将消息抽象成一个整数,该整数数值代表消息的优先级。优先级消息队列是一个这样的队列:任何时间都有可能有消息入队列,任何时间都有可能消息出队列。但只能弹出当前保存的优先级最高的消息。
class CPriorityMsgQueue { public: //任意消息进入队列 void enQueue(int msg); //优先级最高的消息弹出队列 int deQueue(); private: //可以自行添加需要的私有成员 }
class CPriorityMsgQueue{ PriorityQueue<Integer> pqueue = new PriorityQueue<Integer>();public void enQueue(int msg){pqueue.offer(msg);}public int deQueue(){pqueue.poll(msg);}}
简单链表的实现过程为在链表的头insert元素,使用O(1)时间完成,每次deleteMin元素,查找出链表中最小的元素,花费O(N)时间完成;另外一种方法是让链表保持有序状态,在进行任务insert的时候进行排序(花费O(N)),每次获取链表的头(花费O(1))。
使用二叉查找树实现中,对于insert和deleteMin花费时间均为O(log(N)),但存在一个潜在问题,既是容易造成不平衡二叉树,因为deleteMin始终是从左边开始往右边进行删除。
// 编辑起来好别扭啊。。。
classCPriorityMsgQueue
class CPriorityMsgQueue { public: //任意消息进入队列 void enQueue(int msg) { for(vector<int>::iterator it=allmsg.begin();it!=allmsg.end();it++) { if(*it<msg) allmsg.insert(it,msg); } } //优先级最高的消息弹出队列 int deQueue() { if(!allmsg.empty()) allmsg.erase(allmsg.begin()); } private: vector<int> allmsg; //可以自行添加需要的私有成员 }
消息队列是项目中经常需要使用的模式,下面使用STL的queue容器实现:
上面的消息队列类只支持在队列的尾部添加一个元素,在许多的应用程序中,需要根据消息的优先级将消息添加到队列中,当一个高优先级的消息来了,需要将该消息添加到所有比它优先级低的消息前面,下面将使用priority_queue来实现优先级消息队列类。
优先级消息队列的实现和上面消息队列实现相似,唯一不同的是这里使用了函数对象来决定优先权CompareMessages,该结构重载了操作符"(,)",该机制可以实现可以将一个函数作为一个参数,和函数指针对比有如下好处:
1.函数对象效率更高,可以是内联函数,函数指针总是有函数调用的开销。
2.函数对象提供了一个安全的实现方法,这样的实现不会出现空指针访问。