C++的deque(双端队列),priority_queue(优先级队列)

deque

deque是一个容器,是双端队列,从功能上来讲,deque是一个vector和list的结合体

顺序表和链表

deque的结构和优缺点

开辟buff小数组,空间不够了,不扩容,而是开辟一个新的小数组

开辟中控数组(指针数组)指向buff小数组

将已存在的数组指针存在中控数组中间,可以使用下标访问

头插向前插,尾插向后插,相比于vector可以较高效率的进行头尾操作

cur指向具体数据,node指向当前数组

first指向数组开始,last指向数组结束

遍历

it == end()后,将it.指向node->first,即下一个buff数组的第一个数据

deqeu的迭代器

用两个迭代器指向第一个和最后一个buff的位置

其余的buff可以通过+-来获得

注意,头插是将数据插入新的开头的buff的尾部

eg.

缺点

在buff小数组内插入删除数据,需要挪动数据,效率低于vector

[ ]访问的效率也不高

因此不能代替vector和list

priority_queue

优先级队列也是一个容器适配器

他的底层是一个堆(二叉堆),需要大量使用 [ ] 访问

优先级队列默认是大堆

迭代器区间构造

仿函数

由于优先级队列默认是大堆

如果想换成小堆,就要使用仿函数

eg.

仿函数就是函数对象:重载了operator()的类

类的对象可以想函数一样使用

eg.

这里的f1() = f1.operator()

即对象可以像函数一样使用

自定义类型

优先级队列需要用户在自定义类型中提供>和<的重载

eg.

日期类

底层

#pragma once#include<vector>
template<class T>
class myless
{bool operator()(const T& x, const T& y){return x < y;}
};template<class T>
class mygreater
{bool operator()(const T& x, const T& y){return x > y;}
};
namespace bit 
{template<class T, class Container = vector<T>, class Compare >//分别是容器内存放的数据的类型,容器和用于比较的仿函数(默认是less)class priority_queue{public://强制编译器生成默认构造priority_queue() = default;template<class InputIterator>priority_queue(InputIterator first, InputIterator last)//迭代器区间构造{while (first != last){_con.push_back(*first);//所有数据放入(现在还不是堆)++first;}//建堆for (int i = (_con.size() - 1 - 1) / 2; i < length; i++)//从倒数第一个非叶子节点开始建堆{adjust_down(i);}}void adjust_up(int child)//制造大堆{Compare comfunc;int parent = (child - 1) / 2;while (child > 0){if (compfunc(_con[parent], _con[child])){swap(_con[parent], _con[child]);child = parent;parent = (child - 1) / 2;}else{break;}}}void push(const T& x){_con.push_back(x);adjust_up(_con.size() - 1);//向上调整}void adjust_down(int parent){Compare compfuncint child = parent * 2 + 1;//左孩子while (child < _con.size()){if (child + 1 < _con.size() && _con.[child] < _con[child + 1])//假设左孩子大且右孩存在{++child;}if (compfunc(_con[parent], _con[child])){swap(_con[parent], _con[child]);parent = child;child = parent * 2 + 1;}else{break;}}}void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back();adjust_down(0);}const T& top(){return _con[0];}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};
}

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

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

相关文章

MICS2024|数字病理与人工智能在乳腺癌精准诊疗中的应用

小罗碎碎念 这两天在厦大开会&#xff0c;医学图像相关的学术会议。来之前一直在我自己的交流群里宣传这个会议&#xff0c;因为自己的推文与病理相关的比较多&#xff0c;所以群里的同行也比较关注这个会议病理相关的内容。 讲者简介 Scopus主页&#xff1a;https://www.scop…

华为机试题-单车道汽车通行时间-Java

代码在最后面 1 题目描述 M&#xff08;1 ≤ M ≤ 20&#xff09;辆车需要在一条不能超车的单行道到达终点&#xff0c;起点到终点的距离为 N&#xff08;1 ≤ N ≤ 400&#xff09;。 速度快的车追上前车后&#xff0c;只能以前车的速度继续行驶&#xff0c;求最后一辆车到达…

赋值运算符.二

# 赋值运算符 # 等号右边先运算 a 10 # 复合运算符&#xff1a; 算术运算符 赋值运算符 简化代码 a a 1 print(a) # 11 a 1 print(a) # 12 a - 2 print(a) # 10 a * 5 print(a) # 50 a % 4 # 等价于: a a % 4 print(a) # 2 a ** 3 print(a) # 8 # P…

旋转电连接器抗干扰性有哪几个方面?

旋转电连接器作为一种精密的电气传输装置&#xff0c;它实现了两个相对旋转部件间的功率和信号传输。通过旋转电连接器可以传输高频的交流电、高电压的交流电、大电流的交流电、弱小的直流小信号等多种电信号&#xff0c;但是由仪器之间的距离有限&#xff0c;在如此短的距离内…

蓝桥杯算法周赛开赛啦

提醒&#xff1a;19:00算法双周赛准时开启&#xff01; 单题“一血”可获得云课定制便携风扇&#xff01; &#x1f9e7;入榜最高200元&#xff01;还可抽20&#xff5e;100元现金 &#x1fad8;每月参加2次算法双周赛&#xff0c;额外发放88个实验豆&#xff01; 参赛链接…

C++:类和对象 I(访问限定符、this指针)

目录 类的定义 类的大小 访问限定符 实例化 this指针 类的定义 class就是类&#xff0c;class是C中的一个关键字 当然类也可以是C语言中的struct&#xff0c;C兼容struct&#xff0c;甚至还有一些升级 定义类的方式 class Date {}; 和C语言的struct一样&#xff0c;c…

企业国产操作系统选型适配实施方案

【摘要】企业在推动国产化进程时&#xff0c;需选择一款主流、稳定且安全的服务器操作系统作为其系统软件。在产品投入实际生产环境前&#xff0c;对上游软硬件的适配情况有深入了解至关重要。本文将重点介绍银河麒麟高级服务器操作系统V10&#xff08;以下简称麒麟V10&#xf…

Spuer().__init__的意义

class MyModel(nn.Module):def __init__(self):super().__init__() # 调用 nn.Module 的 __init__# 现在 nn.Module 的初始化完成&#xff0c;我们可以添加自定义层self.conv1 nn.Conv2d(1, 20, 5)self.conv2 nn.Conv2d(20, 20, 5) super().__init__() 在这里确实是在显式调…

昇思25天学习打卡营第14天|K近邻算法实现红酒聚类

红酒Wine数据集 类别(13类属性)&#xff1a;Alcohol&#xff0c;酒精&#xff1b;Malic acid&#xff0c;苹果酸 Ash&#xff0c;灰&#xff1b;Alcalinity of ash&#xff0c;灰的碱度&#xff1b; Magnesium&#xff0c;镁&#xff1b;Total phenols&#xff0c;总酚&#xf…

算法可以赋能教育业务的哪些场景?

本文内容就一个点&#xff0c;将算法应用到教育系统中的各场景&#xff0c;让每个业务模块都实现智能化 以下列举出所有的需求点 目录 一、千人千面&#xff0c;个性化推荐流&#xff0c;推荐用户感兴趣的内容 实现方案&#xff1a;CTR模型 应用场景&#xff1a;所有的内容…

Perl语言之数组

Perl数组可以存储多个标量&#xff0c;并且标量数据类型可以不同。   数组变量以开头。访问与定义格式如下&#xff1a; #! /usr/bin/perl arr("asdfasd",2,23.56,a); print "输出所有:arr\n"; print "arr[0]$arr[0]\n"; #输出指定下标 print…

NLP任务:情感分析、看图说话

我可不向其他博主那样拖泥带水&#xff0c;我有代码就直接贴在文章里&#xff0c;或者放到gitee供你们参考下载&#xff0c;虽然写的不咋滴&#xff0c;废话少说&#xff0c;上代码。 gitee码云地址&#xff1a; 卢东艺/pytorch_cv_nlp - 码云 - 开源中国 (gitee.com)https:/…

deepin 卸载nginx

在Deepin系统中&#xff0c;要卸载nginx&#xff0c;可以通过终端执行以下步骤&#xff1a; 停止nginx服务&#xff1a; sudo systemctl stop nginx 禁用nginx服务&#xff08;如果不再需要开机自启&#xff09;&#xff1a; sudo systemctl disable nginx使用包管理器卸载ngi…

初始c语言 语句

一 认识语句 控制流语句 if-else语句&#xff1a;用于条件判断。for循环语句&#xff1a;用于循环执行一段代码。while循环语句&#xff1a;当条件为真时执行循环。do-while循环语句&#xff1a;先执行一次循环体&#xff0c;然后再判断条件。switch语句&#xff1a;根据不同的…

pyinstaller系列教程(一)-基础介绍

1.介绍 PyInstaller是一个用于将Python应用程序打包为独立可执行文件的工具&#xff0c;它支持跨平台操作&#xff0c;包括Windows、Linux和MacOS等操作系统。特点如下&#xff1a; 跨平台支持&#xff1a;PyInstaller可以在多个操作系统上运行&#xff0c;并生成相应平台的可…

Kotlin Flow 防抖 节流

防抖和节流是针对响应跟不上触发频率这类问题的两种解决方案。 一:防抖&#xff08;debounce&#xff09;的概念&#xff1a; 防抖是指当持续触发事件时&#xff0c;一定时间段内没有再触发事件&#xff0c;事件处理函数才会执行一次&#xff0c; 如果设定时间到来之前&#x…

CEPH 硬盘读写慢问题影响

ceph使用时经常会碰到起不来的情况 第一种就是服务器负载高&#xff0c;这个基本都会觉察到 还有一种就是硬盘问题 硬盘写问题 初始化时ceph会自己进行填充操作 ceph-volume lvm zap /dev/sdx --destroy 我就碰到过没初始化问题 看着一切正常 但看写入速度才几百KB/s 正常都100…

Leetcode刷题4--- 寻找两个正序数组的中位数 Python

目录 题目及分析方法一&#xff1a;直接合并后排序方法二&#xff1a;二分查找法 题目及分析 &#xff08;力扣序号4&#xff1a;[寻找两个正序数组的中位数](https://leetcode.cn/problems/median-of-two-sorted-arrays/description/&#xff09; 给定两个大小分别为 m 和 n …

ArrayList模拟实现

ArrayList模拟实现 ArrayList 的初步介绍常见操作 ArrayList 的简单模拟实现 ArrayList 的初步介绍 ArrayList也叫做顺序表&#xff0c;底层是一个数组。 在创建顺序表 时就应该规定 里面元素的数据类型&#xff0c;其中不能直接传基本数据类型&#xff0c;例如int、char。需要…

Java代码初始化块

目录 实例域代码块 静态域代码块 初始化代码块分为静态域代码块和实例域代码块&#xff0c;静态域代码块在类第一次被加载时被执行&#xff0c;实例域代码块在创建对象时被执行&#xff0c;一个类中可以有多个代码块。 实例域代码块 使用方法 可以有输出语句 可以对类的属…