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

news2024/9/23 5:24:44
定义于头文件 <algorithm>

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

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

从最大堆中移除最大元素

std::pop_heap

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

(1)(C++20 前)

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

(C++20 起)

template< class RandomIt, class Compare >
void pop_heap( RandomIt first, RandomIt last, Compare comp );

(2)(C++20 前)

template< class RandomIt, class Compare >
constexpr void pop_heap( RandomIt first, RandomIt last, Compare comp );

(C++20 起)

交换在位置 first 的值和在位置 last-1 的值,并令子范围 [first, last-1) 变为。这拥有从范围 [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 必须满足值可交换 (ValueSwappable) 和 遗留随机访问迭代器 (LegacyRandomAccessIterator) 的要求。
- 解引用 RandomIt 结果的类型必须满足可移动赋值 (MoveAssignable) 和可移动构造 (MoveConstructible) 的要求。

返回值

(无)

复杂度

至多 2×log(N) 次比较,其中 N=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(5);
    std::generate(cells1.begin(), cells1.end(), func1);

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

    // 打印cells1
    std::cout << "before pop_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;

    //交换在位置 first 的值和在位置 last-1 的值,并令子范围 [first, last-1) 变为堆。
    std::pop_heap(cells1.begin(), cells1.end());

    // 打印cells1
    std::cout << "after pop_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;
    std::cout << 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(5);
    std::generate(cells2.begin(), cells2.end(), func1);

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

    // 打印cells1
    std::cout << "before pop_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(), is_sortf) << std::endl;
    std::cout << std::endl;

    //交换在位置 first 的值和在位置 last-1 的值,并令子范围 [first, last-1) 变为堆。
    std::pop_heap(cells2.begin(), cells2.end(), is_sortf);

    // 打印cells2
    std::cout << "after pop_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(), is_sortf) << std::endl;

    return 0;
}

输出

 

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

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

相关文章

IOC 操作 Bean 管理( Bean 的生命周期)

生命周期 从对象创建到对象销毁的过程 Bean 的生命周期 通过构造器创建 Bean 实例&#xff08;无参构造&#xff09;为 Bean 的属性设置值和对其他 Bean 引用&#xff08;调用 set 方法&#xff09;调用 Bean 的初始化的方法&#xff08;需要进行配置&#xff09;Bean 可以使…

Java项目:SSM校园班级同学通讯录管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 管理员角色包含以下功能&#xff1a; 管理员登录,修改管理员资料,用户管理,公告管理,系别信息管理,班级管理,学生通讯录管理等功能。 用户角色包…

微信小程序框架(一)-全面详解(学习总结---从入门到深化)

目录 小程序与普通网页开发的区别 体验小程序 微信小程序账号申请 微信小程序开发者工具 下载安装 创建项目 开发者工具说明 小程序目录结构 描述整体的 app 描述各自页面的 page 全局配置_Pages Pages配置 entryPagePath 快捷生成页面方案 全局配置_window 常用属性…

太卷了,5年Java程序员竟答不出应届生字节二面?

11.22一面过 11.23二面挂 上一个部门寄了&#xff0c;给我换了个流程唉 一面 面试官问我&#xff0c;三面面评这么好为啥不继续了&#xff0c;我纳闷了&#xff0c;不是你们挂的我吗 介绍项目&#xff0c;点赞是怎么考量的&#xff0c;热度点赞问题怎么解决&#xff0c;具体…

【混合网络】

A Novel Adaptive Hybrid Fusion Network for Multiresolution Remote Sensing Images Classificatio &#xff08;一种新的自适应混合融合网络在多分辨率遥感图像分类中的应用&#xff09; 随着对地观测技术的快速发展&#xff0c;全色&#xff08;PAN&#xff09;和多光谱&…

【OpenCV-Python】教程:4-6 FAST (Features from Accelerated Segment Test)算法角点检测

OpenCV Python FAST&#xff08;Features from Accelerated Segment Test&#xff09; 算法角点检测 【目标】 理解FAST算法的理论基础&#xff1b;用OpenCV里的FAST 检测角点&#xff1b; 【理论】 我们看到了几个特征检测器&#xff0c;其中很多都非常好。但是从实时应用…

预训练语言模型

一、预训练 对于一个具有少量数据的任务 A&#xff0c;首先通过一个现有的大量数据搭建一个 CNN 模型 A&#xff0c;由于 CNN的浅层学到的特征通用性特别强&#xff0c;因此在搭建一个 CNN 模型 B&#xff0c;其中模型 B 的浅层参数使用模型 A 的浅层参数&#xff0c;模型 B 的…

Android Studio Dolphin logct日志台新版特性及老版本恢复

Android Studio Dolphin logct日志台新版特性及老版本恢复 日志台在此版本进行了更新&#xff0c;本文按官网描述简要汇总了其新特性和使用方法&#xff0c;以及老版本的日志如何恢复。 老版本日志台恢复 如果是习惯了老版本日志台的仁兄&#xff0c;可按下方截图操作进入Se…

IDEA安装ChatGPT插件步骤

首先感谢大佬的提供的插件【ChatGPT JetBrains插件完整版发布。让AI帮你写代码。-哔哩哔哩】 **前期准备&#xff1a;**需要注册OpenAI账号。不会的可以见我的教程&#xff1a;传送门 1、注册号账号后&#xff0c;打开网站https://chat.openai.com/api/auth/session 复制acess…

TS201的外部中断和定时终端控制FLAG输出(含参考源码)

硬件准备 ADZS-TS201S-EZLITE&#xff1a;ADI TS201开发板 AD-HP560ICE&#xff1a;ADI DSP专用仿真器 软件准备 Visual DSP软件 硬件链接 外部中断控制FLAG输出 原理就不讲了&#xff0c;前面几章都有说。 调试步骤: 1)打开VisualDSP&#xff0c;并新建一个工程文件&am…

C语言刷题系列——8.矩阵的行/列互换

&#x1f6a9;矩阵的行/列互换⛄一) 题目要求⛄二) 题解step1:输入矩阵step2:输入k(执行 行/列 互换操作的次数)step3:&#xff08;循环内部&#xff09;行/列互换step4:打印互换后的矩阵⛄三) 最终的实现⛄一) 题目要求 输入描述&#xff1a;第一行包含两个整数n和m&#xff…

基于pytest来演示一个PO测试模式案例

首先要说的是&#xff0c;这是一个很简易的案例&#xff0c;目的在于体会这样一种结构。 第一部分&#xff1a;基本操作 案例描述&#xff1a;启动浏览器--打开好123--点击logo--跳转到百度--输入搜索词汇--点击按钮开始搜索。 模式描述&#xff1a;这个模式把元素的提取、元…

基于Java实现(WEB)影院管理系统(TMS)【100010015】

电影院系统需求规格说明 1. 引言 1.1 目的 本文档描述了影院管理系统的功能需求和非功能需求。开发小组的软件系统实现与验证工作都以此文档为依据。1.2 范围 影院管理系统是为了xx影院开发的业务系统&#xff0c;开发的目标是帮助该影院处理日常的重点事物&#xff0c;包括…

算法基础篇-03-查找(顺序查找和二分法查找)

1.查找 查找&#xff1a;在一些数据元素中&#xff0c;通过一定的方法找出与给定关键字相同的数据元素的过程&#xff1b;列表查找(线性表查找)&#xff1a;从列表中查找指定元素&#xff1b; 输入&#xff1a; 列表&#xff0c;待查找元素输出&#xff1a;元素下标(未找到元素…

【Linux】git的使用

&#x1f922;Linux 关联到gitee的操作记录 &#x1f922;Linux 下下载gitee的库 &#x1f92c;sudo yum install git 在Linux中安装git这个软件 &#x1f92c;git clone 下载gitee库到本地 &#x1f92c;git add. 将代码放到刚才下载好的目录中 &#x1f92c;git commit -…

HTML网上书店静态HTML网页作业作品 大学生三联书店网页设计制作成品 简单DIV CSS布局网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

SpringBoot 如何进行业务校验,老鸟们都这么玩的~

throw new IllegalArgumentException(“用户不存在&#xff01;”); } } 采用Assert能使代码更优雅&#xff0c;更简洁。 还是上面的例子&#xff0c;如果采用Assert可以这样写&#xff1a; public void test2(int accountId) { Account account accountDao.selectById(…

【力扣篇一】数组30题

前言 &#xff08;12月5日&#xff09;突然想起了很久以前别人&#xff08;具体来源已经记不清了&#xff09;传给我的一套题单。网上的题单不少&#xff0c;光收藏可不行&#xff0c;关键还得下手。 这套题单的题目数量为300出头&#xff0c;什么时候刷完我还没有明确计划&a…

对标40亿美金Webflow,「Towify」想用无代码方式搭建小程序

低代码和无代码的浪潮,在全球已经席卷了几次。今年以来,以低代码、无代码方式为主的网页开发、搭建工具受到了资本和市场的认可: 2022年8月,成立于2017年的低代码-内部程序开发平台Retool完成4500万美元融资,投后估值32亿美元。2022年3月,成立于2012年的无代码-外部网页搭…

关于魔趣刷机(含root)步骤

关于魔趣刷机&#xff08;含root&#xff09;步骤准备工作第一步&#xff1a;下载room和TWRP第二步&#xff1a;刷入TWRP到手机第三步&#xff1a;刷入room到手机第四步&#xff1a;安装Magisk app第四步&#xff1a;验证手机是否root参考链接准备工作 一台手机(推荐小米)、TW…