• 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. }

    直接报错。


    如有错误,敬请斧正 

  • 相关阅读:
    Eclipse iceoryx(千字自传)
    TWAS模型数据*.wgt.RDat查看及导入R
    kafka
    java计算机毕业设计学生日常事务管理系统源码+mysql数据库+lw文档+系统+调试部署
    ChatGPT如何助力科研创新,提升研究效率?
    测试左移右移-理论篇
    【比特熊故事汇2.0】|即使每天都是新的探险,他也会快乐Say Hi
    上海亚商投顾: 市场震荡整理 飞机、消费股表现强势
    洛谷 P2709 小B的询问(莫队 模板)
    Redis漏洞总结--未授权--沙箱绕过--(CNVD-2015-07557)&&(CNVD-2019-21763)&&(CVE-2022-0543)
  • 原文地址:https://blog.csdn.net/weixin_61857742/article/details/127776538