小议set与priority_queue之选择

本文对比分析了在程序设计中使用set与priority_queue作为优先级队列时的不同场景及优劣,包括对删除操作的支持、遍历性能以及插入效率等方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 当我们的程序中需要使用优先级队列时,常常考虑到两种数据结构,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吧。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值