📜  C++ STL 中的 make_heap()(1)

📅  最后修改于: 2023-12-03 15:13:55.011000             🧑  作者: Mango

C++ STL 中的 make_heap()

C++ STL 中的 make_heap() 是一个函数模板,定义在 <algorithm> 头文件中,用于将一段范围内的元素转化为最大堆或最小堆。最大堆的定义是:父节点的元素值大于或等于子节点的元素值;最小堆的定义是:父节点的元素值小于或等于子节点的元素值。

函数声明
template<class RandomAccessIterator>
void make_heap(RandomAccessIterator first, RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
void make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
  • RandomAccessIterator:随机访问迭代器,指向待转化为最大堆或最小堆的元素范围的起始位置。
  • first:待转化元素范围的第一个元素。
  • last:待转化元素范围的最后一个元素的下一个元素。
  • comp:自定义函数对象,用于指定元素间的比较方式。
函数特征
  1. 自动将指定范围的元素转化为最大堆或最小堆。
  2. 时间复杂度为 $O(n)$。
  3. 缺点是需要保证指定范围的元素数量不能太大,否则会导致过多的内存移动。
示例
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> v {10, 30, 20, 5, 15};

    // 转化为最大堆
    std::make_heap(v.begin(), v.end());
    for (const auto &i : v) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // 转化为最小堆
    auto cmp = [](int a, int b) { return a > b; };
    std::make_heap(v.begin(), v.end(), cmp);
    for (const auto &i : v) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    return 0;
}

以上代码的输出结果为:

30 15 20 5 10
5 10 20 30 15

第一次调用 make_heap() 后,v 就被转化为了最大堆。第二次调用时,通过自定义比较方式,v 被转化为了最小堆。