• C++语法——make_heap、push_heap、pop_heap、sort_heap使用介绍


    目录

    一.make_heap(...)

    二.push_heap(...)

    三.pop_heap(...)

    四.sort_heap(...)


    这三个函数位于头文件中。

    可以看这篇文章了解堆排序手把手教你堆排序

    一.make_heap(...)

    这是该函数的官方定义:

     这个函数用于建立堆。

    前两个参数为迭代器类型,最后一个为仿函数,用于确定建堆方式。

    默认使用大堆排序。

    可以调用官方仿函数greater,构建小堆排序,也可以自定义仿函数给参数comp

    使用方式如下:

    1. int main()
    2. {
    3. vector<int> arr = { 20, 43, 21, 1, 6, 30 };
    4. make_heap(arr.begin(), arr.end());//默认大堆
    5. cout << arr.front();//输出堆顶
    6. return 0;
    7. }

    二.push_heap(...)

    官方定义:

     这个用于将堆底数据加入堆结构中。

    因为make_heap只能建堆,如果当前堆数据发生改变,就需要使用push_heap重回大堆/小堆。

    值得注意:first 到 last-1 之间的元素必须满足堆结构。它仅仅是将last之前元素插入堆中

    意思就是,如果一次性插入多个元素,它只会把最后一个元素(堆底)加入堆结构中

    其参数与make_heap相同,不再赘述。

    使用方式如下:

    1. int main()
    2. {
    3. vector<int> arr = { 20, 43, 21, 1, 6, 30 };
    4. make_heap(arr.begin(), arr.end());
    5. arr.push_back(99);
    6. arr.push_back(79);
    7. push_heap(arr.begin(), arr.end());
    8. cout << "此时堆顶:" << arr.front() << endl;
    9. return 0;
    10. }

     可以发现,99并没有成为堆顶元素,因为79才是最后一个插入的数据,99被“忽视”了,使用时要格外注意。

     

    三.pop_heap(...)

    官方定义:

    该函数作用是“删除”堆顶元素。

    为什么加引号——因为就像堆排序那样,所谓删除只是将堆顶元素移至堆底。 

    其实就是把first元素与last上一个元素交换位置。因为默认last指向堆底的下一个位置(空位置),就像vector的end()一样。

    当然其参数与push_heap相同,不再赘述。

    使用方式如下:

    1. int main()
    2. {
    3. vector<int> arr = { 20, 43, 21, 1, 6, 30 };
    4. make_heap(arr.begin(), arr.end());//建大堆
    5. cout << "原堆顶:" << arr.front() << endl;
    6. pop_heap(arr.begin(), arr.end());
    7. cout << "此时堆顶:" << arr.front() << endl;
    8. cout << "此时堆底:" << arr.back();
    9. return 0;
    10. }

      

    四.sort_heap(...)

    官方定义:

     该函数就是堆排序

    但前提是该结构在调用sort_heap前已经是堆结构。

    sort_heap内部只是把堆顶放堆底,然后再排堆,再取堆顶到新堆底,...直到排完。

    同样,参数不再赘述,与之前一致。

    重点还是使用:

    1. int main()
    2. {
    3. vector<int> arr = { 20, 43, 21, 1, 6, 30 };
    4. make_heap(arr.begin(), arr.end());//确保排序前已是堆结构
    5. sort_heap(arr.begin(), arr.end());
    6. for (auto n : arr)
    7. cout << n << " ";
    8. return 0;
    9. }

    1. //错误代码
    2. int main()
    3. {
    4. vector<int> arr = { 20, 43, 21, 1, 6, 30 };
    5. //排序前不是堆结构
    6. sort_heap(arr.begin(), arr.end());
    7. for (auto n : arr)
    8. cout << n << " ";
    9. return 0;
    10. }

    直接报错。


    如有错误,敬请斧正 

  • 相关阅读:
    05 MSYS2中安装树莓派32位和64位ARM交叉编译工具
    grpc gateway malformed header: missing HTTP content-type
    [NewStarCTF 2023] web题解
    数据库设计 ER图
    QR.js JS 生成 PNG二维码图片,使用说明
    微波雷达人体感应器,即时存在感知方案,智能家居人体感应交互
    软件配置 | mac M1 上 imagemagick 的安装
    抛砖系列之git仓库拆分工具git-filter-repo
    CF1700D River Locks
    C#Word上传和转成Pdf实现
  • 原文地址:https://blog.csdn.net/weixin_61857742/article/details/127776538