C++11标准模板(STL)- 算法(std::make_heap)

news2024/11/8 16:40:44
定义于头文件 <algorithm>

算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first, last) ,其中 last 指代要查询或修改的最后元素的后一个元素。

数据结构的堆物理结构是数组逻辑结构是完全二叉树

从一个元素范围创建出一个最大堆

std::make_heap

template< class RandomIt >
void make_heap( RandomIt first, RandomIt last );

(1)(C++20 前)

template< class RandomIt >
constexpr void make_heap( RandomIt first, RandomIt last );

(C++20 起)
template< class RandomIt, class Compare >

void make_heap( RandomIt first, RandomIt last,

                Compare comp );
(2)(C++20 前)
template< class RandomIt, class Compare >

constexpr void make_heap( RandomIt first, RandomIt last,

                          Compare comp );
(C++20 起)

在范围 [first, last) 中构造最大堆。函数第一版本用 operator< 比较元素,第二版本用给定的比较函数 comp

参数

first, last-制作堆来源的元素范围
comp-比较函数对象(即满足比较 (Compare) 要求的对象),若首个参数小于第二个,则返回 ​true 。

比较函数的签名应等价于如下:

 bool cmp(const Type1 &a, const Type2 &b);

虽然签名不必有 const & ,函数也不能修改传递给它的对象,而且必须接受(可为 const 的)类型 Type1Type2 的值,无关乎值类别(从而不允许 Type1 & ,亦不允许 Type1 ,除非 Type1 的移动等价于复制 (C++11 起))。
类型 Type1 与 Type2 必须使得 RandomIt 类型的对象能在解引用后隐式转换到这两个类型。 ​

类型要求
- RandomIt 必须满足遗留随机访问迭代器 (LegacyRandomAccessIterator) 的要求。
- 解引用 RandomIt 结果的类型必须满足可移动赋值 (MoveAssignable) 和可移动构造 (MoveConstructible) 的要求。

返回值

(无)

复杂度

至多 3*std::distance(first, last) 次比较。

注意

最大堆是拥有下列属性的元素范围 [f,l)

  • N = l - f ,对于所有 0 < i < Nf[floor(
    i-1
    2
    )] 不小于 f[i]
  • 可用 std::push_heap() 添加新元素
  • 可用 std::pop_heap() 移除首元素

 

调用示例

#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
#include <iterator>
#include <time.h>

using namespace std;

struct Cell
{
    int x;
    int y;

    Cell &operator +=(const Cell &cell)
    {
        x += cell.x;
        y += cell.y;
        return *this;
    }

    bool operator <(const Cell &cell) const
    {
        if (x == cell.x)
        {
            return y < cell.y;
        }
        else
        {
            return x < cell.x;
        }
    }
};

std::ostream &operator<<(std::ostream &os, const Cell &cell)
{
    os << "{" << cell.x << "," << cell.y << "}";
    return os;
}

int main()
{
    srand((unsigned)time(NULL));;

    std::cout.setf(std::ios_base::boolalpha);

    auto func1 = []()
    {
        int n = std::rand() % 10 + 100;
        Cell cell{n, n};
        return cell;
    };

    // 初始化cells1
    vector<Cell> cells1(6);
    std::generate(cells1.begin(), cells1.end(), func1);

    // 打印cells1
    std::cout << "cells 1 :         ";
    std::copy(cells1.begin(), cells1.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    std::cout << "is_heap:          " << std::is_heap(cells1.begin(), cells1.end()) << std::endl;
    std::cout << std::endl;

    // 生成堆
    std::make_heap(cells1.begin(), cells1.end());

    // 打印cells1
    std::cout << "after make_heap:  ";
    std::copy(cells1.begin(), cells1.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    std::cout << "is_heap:          " << std::is_heap(cells1.begin(), cells1.end()) << std::endl;
    std::cout << std::endl;


    auto is_sortf = [](const Cell & a, const Cell & b)
    {
        if (a.x == b.x)
        {
            return a.y > b.y;
        }
        return a.x > b.x;
    };

    // 初始化cells2
    vector<Cell> cells2(6);
    std::generate(cells2.begin(), cells2.end(), func1);

    // 打印cells2
    std::cout << "cells 2 :         ";
    std::copy(cells2.begin(), cells2.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    std::cout << "is_heap:          " << std::is_heap(cells2.begin(), cells2.end(), is_sortf) << std::endl;
    std::cout << std::endl;

    // 生成堆
    std::make_heap(cells2.begin(), cells2.end(), is_sortf);

    // 打印cells1
    std::cout << "after make_heap:  ";
    std::copy(cells2.begin(), cells2.end(), std::ostream_iterator<Cell>(std::cout, " "));
    std::cout << std::endl;

    std::cout << "is_heap:          " << std::is_heap(cells2.begin(), cells2.end()) << std::endl;

    return 0;
}

输出

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/74167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

走向大模型、大算力、大数据:特斯拉与毫末的自动驾驶AI路径寻踪

2022行至年终&#xff0c;各种年度总结也纷至沓来。要说最近的大事件&#xff0c;一定少不了&#xff1a;自动驾驶又双叒寒冬了。大量“报忧不报喜”的新闻&#xff0c;说明2022年自动驾驶行业确实出现了一定程度的波动&#xff1a;激光雷达鼻祖德国ibeo和独角兽Argo.ai相继破产…

less基础

less基础 1、维护CSS的弊端 CSS是一门非程序语言&#xff0c;没有变量、函数、SCOPE(作用域) 等概念 CSS需要书写大量看似没有逻辑的代码&#xff0c;CSS冗余度是比较高的不方便维护及扩展&#xff0c;不利于复用CSS没有很好的计算能力非前端开发工程师来讲&#xff0c;往往会因…

[附源码]Python计算机毕业设计Django作业查重系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

AirPods Pro 2用户反馈出现耗电严重情况,Find My功能是其最大亮点

多位 AirPods Pro 2 用户反馈&#xff0c;在升级安装最新版本之后出现了耗电严重的情况。AirPods Pro 2 充电盒的电池即使在不使用的情况下也会出现耗电情况。受影响的用户反馈在不使用状态下&#xff0c;一晚上可以消耗 10% 的电量。 这些受影响的 AirPods Pro 2 用户反馈&…

业界认可+1!网易云信入选首批智慧教育产品和服务供应商名录

近日&#xff0c;2022&#xff08;第二十一届&#xff09;中国互联网大会在深圳成功召开。大会期间&#xff0c;由中国互联网协会智慧教育工作委员会、中国信息通信研究院合办的智慧教育论坛如期举行&#xff0c;论坛以“数智启新聚势&#xff0c;教育点亮未来”为主题&#xf…

Android AOSP和Android-X86源码下载编译终极普法

Android AOSP和Android-X86源码下载编译终极普法 引言 最近有朋友在询问怎么下载Android AOSP源码和Android-X86源码&#xff0c;编译学习&#xff01;其实这个说简单也简单&#xff0c;说复杂吗也不复杂。但是难在真的干起来&#xff01;凯子哥的风格吗&#xff0c;既然朋友们…

JavaSe

软件&#xff1a; 一系列按照特定顺序组织的计算机数据和指令的集合、有系统软件&#xff08;window、linux&#xff09;和应用软件&#xff08;QQ、微信&#xff09;之分。 人机交互方式&#xff1a; 图形化界面&#xff08;GUI&#xff09;鼠标直接点击&#xff08;简单直观…

留学Assignment写作方法和步骤整理

Assignment主要讨论的是研究性话题&#xff0c;深入剖析和研究主题&#xff0c;对于Assignment的主题进行探讨&#xff0c;从而更深入的了解&#xff0c;科技类Assignment偏向科技实用性&#xff0c;而对于文科类Assignment则偏向于探讨。要让Assignment更具价值&#xff0c;应…

【LSTM时序预测】基于卷积神经网络结合BiLSTM实现时序数据预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?

点亮 ⭐️ Star 照亮开源之路https://github.com/apache/dolphinscheduler01.DolphinScheduler 和 Python API 介绍Apache DolphinScheduler 是一个分布式、可扩展的工作流调度器平台&#xff0c;具有强大的 DAG 可视化界面。它可以帮助用户更轻松地构建和维护任何规模的工作流…

计算机毕业设计springboot+vue基本微信小程序的二手车交易平台

项目介绍 首先,论文一开始便是清楚的论述了小程序的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了小程序的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据…

木字楠后台管理系统开发(2):SpringBoot项目代码生成以及基础接口测试

&#x1f3b6; 文章简介&#xff1a;木字楠后台管理系统开发(2)&#xff1a;SpringBoot项目代码生成以及基础接口测试 &#x1f4a1; 创作目的&#xff1a;为了带大家完整的体验木字楠后台管理系统模版的开发流程 ☀️ 今日天气&#xff1a;一场秋雨一场寒&#xff0c;天气越来…

云原生之使用Docker部署docker-compose-ui工具

云原生之使用Docker部署docker-compose-ui工具一、Docker Compose UI介绍二、检查本地docker环境1.检查系统版本2.检查docker状态三、下载Docker Compose UI镜像四、部署Docker Compose UI服务1.新建安装目录2.创建Docker Compose UI容器3.检查Docker Compose UI容器状态4.查看…

3 - 线程池 Java内置的线程池

1、ExecutorService的介绍 ExecutorService 接口继承了Executor 接口&#xff0c;是Executor 的子接口。 Executors类 提供工厂方法用来创建不同类型的线程池。Executors是工具类&#xff0c;他提供对ThreadPoolExecutor的封装&#xff0c;会产生几种线程池供大家使用。 关于…

20 个超级实用的 CSS 技巧,帮助你成为更好的开发者

在开发项目中&#xff0c;修改输入占位符样式&#xff0c;多行文本溢出&#xff0c;隐藏滚动条&#xff0c;修改光标颜色&#xff0c;水平和垂直居中等等&#xff0c;这些都是我们非常熟悉的开发场景&#xff01;前端开发者几乎每天都会和它们打交道&#xff0c;因此&#xff0…

Visual Studio 平台下基于 C# /.NET 的 Android 开发

文章目录Part.I IntroductionChap.I 环境搭建Part.II ExamplePart.I Introduction 因为想尝试一下移动端的开发&#xff0c;所以在网上简单搜了一下移动端开发可以使用的语言&#xff0c;发现 Java, C# 等都可以。虽然用Java的居多&#xff0c;但是笔者对C#较为熟悉一些&#x…

TikTok变现冲不冲?这些TikTok选品方法赶快用上

TikTok电商商家们通常最忧愁的就是不知道如何有效进行TikTok选品。有时候因为选到难卖的产品&#xff0c;就会导致库存积压、资金紧缺等问题。今天&#xff0c;为TikTok电商商家们分享一些好用、有效的TikTok选品方法~ TikTok选品方法一——利用电商平台数据选品 除了一些偏地…

[附源码]JAVA毕业设计文物管理系统(系统+LW)

[附源码]JAVA毕业设计文物管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

速卖通官方公告:“不活跃商品”管理规则,将于12月12日生效!

最新平台动向&#xff1a;速卖通“黑色星期五”大促开始。作为海外最火的促销购物节黑五与世界杯重叠&#xff0c;速卖通上热销海外的国货有了显著的新趋势&#xff1a;越来越多具有更高科技含量的国货在海外走红。其中&#xff0c;速卖通上国产VR眼镜成为今年最火的商品&#…

Kubernetes 调度器详解

kube-scheduler是 kubernetes 系统的核心组件之一&#xff0c;主要负责整个集群资源的调度功能&#xff0c;根据特定的调度算法和策略&#xff0c;将 Pod 调度到最优的工作节点上面去&#xff0c;从而更加合理、更加充分的利用集群的资源&#xff0c;这也是我们选择使用 kubern…