<<STL源码剖析>>原书中的一个问题

本文探讨了原书中关于heap算法的__adjust_heap()和__make_heap()函数的问题。作者建议的代码修改在特定情况下可能导致生成错误的堆。通过举例说明,当vector包含【10,9】两个元素时,按照作者的修改,make_heap会生成错误的堆【9,10】,而原代码则能正确生成【10,9】的堆。文章指出,作者可能未在后续版本中修正这个问题。

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

原书中4.7.2节 heap算法

__adjust_heap()函数中调用了__push_heap函数,原作者注释:依侯捷之见,下面直接改为*(first + holeIndex) = value;应该是可以的。

这里是不可以的。如果__adjust_heap()单纯被__pop_heap()函数调用,这没什么问题,但在__make_heap()函数中也调用了__adjust_heap()函数, 最后一个参数传的是parent结点的值,按照作者的假定,这无法得出正确的堆。举个例子,vector有两个元素【10,9】,如下图所示:

       如果按照作者的设想,调用make_heap后,在vector中变成【9,10】。如果按照原代码,调用调用make_heap后生成堆在vector中是【10,9】,是正确的。

       不知道作者有没有在新版中修正过。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值