当我们的程序中需要使用优先级队列时,常常考虑到两种数据结构,set和priority_queue,然后不知道用哪一个好。先分析一下我们的需求:
1.是否需要随时从容器中删除某项,比如一个待释放的资源队列,有时我们需要放弃释放,就要从待释放资源队列中删除。
2.是否需要维持队列并依次处理,还是说队列仅仅是为了一次性的排序。也就是是否需要遍历容器中的元素。
第一点,priority_queue是不提供删除任意一项的,它提供的方法非常有限,只有push,pop,top等几个,而set有erase方法。
第二点,可怜的priority_queue竟然没有提供iterator,想要遍历的唯一方法就是不断的top和pop直到容器为空。从性能上考虑,priority_queue遍历时必须删除,导致了额外的删除开销,而一个iterator迭代器却不需要对容器结构做任何修改,性能上更胜一筹。
第三点,还是性能,priority_queue实际上是一个wrapper,它需要底层的容器支持,默认的容器是vector,我们知道vector本身类似于数组,要插入数据的开销是O(n)。再来看一下set,它使用的是B树,我们知道,B树在插入的时候开销是O(nlogn),可见,孰高孰低也是不言而喻的。
那么,priority_queue到底有什么好处呢?答案是安全,仅提供了有限的push,pop,top几个函数,想要破坏内部结构都不行,呵呵,不过高手建议还是用set吧。