咨询std::is_heap/std::make_heap的堆定义及std::less下的简化说明
C++ 堆(Heap)的简化定义说明
先明确:当使用默认比较器std::less<T>时,C标准库中的堆默认是大顶堆(最大堆),下面针对不同C版本拆解定义:
C++20之前的简化说明
对于存储在随机访问容器(比如std::vector)里的堆:
- 把容器元素按数组形式看待,索引为
i的元素,它的父节点索引是(i-1)/2(整数除法) - 所有子节点(索引
i>0)都满足:父节点的值 不小于 子节点的值(也就是parent >= child) - 对应原定义的
bool(comp(first[(i-1)/2], first[i])) == false:因为std::less(a,b)返回true的条件是a < b,所以这个条件等价于parent < child不成立,即parent >= child
C++20之后的简化说明
C20引入了投影的概念,但这里用的是std::identity{}(恒等投影,意思是直接用元素本身参与比较,不做任何转换),所以本质和C20之前的逻辑完全一致:
- 当使用
std::less作为比较器时,仍然要求每个父节点的值不小于子节点的值,也就是大顶堆 - 新定义只是把“投影”这个通用化逻辑明确出来,方便后续扩展自定义投影的场景,对默认用法没有影响
举个简单例子:如果容器里的元素是[5,3,4,1,2],这就是一个大顶堆——根节点5是最大的,5的子节点3和4都小于它;3的子节点1和2也都小于它,完全符合上述规则。
内容的提问来源于stack exchange,提问作者kingsjester
相关产品推荐
相关产品推荐

