当前位置: 首页 > news >正文

list(二)和_stack_queue

在这里插入图片描述

嗨喽大家好,时隔许久阿鑫又给大家带来了新的博客,list的模拟实现(二)以及_stack_queue,下面让我们开始今天的学习吧!

list(二)和_stack_queue

1.list的构造函数

2.设计模式之适配器和迭代器

3.新容器deque

4.优先级队列

5.仿函数

1.list的构造函数

在这里插入图片描述

最好加上引用,如果不加引用,T为list时,将it解引用赋值给e时,list为自定义类型要耗费大量空间进行拷贝操作,所以在利用for语句时,我们最好加上引用

//list的默认构造,构造出一个头节点
void empty_init()
{//利用节点的默认构造,生成一个节点//定义该节点为头节点,节点对象拥有两个成员变量_head = new Node();_head->_next = _head;_head->_prev = _head;
}list(initializer_list <T> il)
{//initializer_list常量数组中有两个指针,分别指向数组的开头和结尾empty_init();for (const auto& e : il){push_back(e);}
}list()
{//看一下交换的时候,是不是新创建的对象是调用默认构造进行初始化empty_init();
}list(const list<T>& it)
{empty_init();for (const auto& e :it){push_back(e);}
}~list()
{clear();delete _head;_head = nullptr;
}void clear()
{auto it = begin();while (it != end()){it = erase(it);}
}
//it1(it3)
list<T>& operator=(list<T> it)
{std::swap(_head, it._head);return *this;
}

2.设计模式之适配器和迭代器

using namespace std;
namespace ZJ
{template<class T, class Container = vector<T>>class Stack{public:void push(const T& x){_con.push_back(x);}void pop(){//后进先出_con.pop_back();}const T& top(){return _con.back();}bool empty(){return _con.empty();}size_t size(){return _con.size();}private :Container _con;};void Test_stack1(){ZJ::Stack<int> st1;st1.push(1);st1.push(2);st1.push(3);st1.push(4);st1.push(5);int n = st1.size();for (int i = 0; i < n; i++){cout << st1.top() << " ";st1.pop();}cout << endl;}}

3.新容器deque

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

deque的每个对象有四个成员变量,每个迭代器中又有四个指针
cur指向当前数据,node(是一个二级指针)指向当前数据在中控数组中的位置,first和last分别指向buff数组中第一个和最后一个数据,而finish中的node指针指向最后一个buff的最后一个数据的下一个位置

在这里插入图片描述
在这里插入图片描述

4.优先级队列

底层是一个堆

在这里插入图片描述
在这里插入图片描述

void Test_priority_queue1()
{vector<int> v1 = { 1,2,3,8,9,7,5,6,4 };priority_queue<int> q1(v1.begin(), v1.end());//for (const auto& e : v1)//{//	q1.push(e);////}while (!q1.empty()){cout << q1.top() << " ";q1.pop();}}

堆逻辑上是一个二叉树,物理结构上是一个数组

在这里插入图片描述
在这里插入图片描述

没有引入仿函数时。

namespace ZJ
{template<class T, class Container = vector<T>>class priority_queue{public: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 >= 0; i--){adjust_down(i);}}void adjust_up(int child){size_t parent = (child - 1) / 2;while (child > 0){if (_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){size_t child = parent * 2 + 1;while (child<_con.size()){if (child + 1 < _con.size() && _con[child] < _con[child + 1]){child = child + 1;}if (_con[child] > _con[parent]){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;};
}

5.1仿函数初识

>仿函数/函数对象,是一个重载了operator()的类。让类的对象可以像函数一样使用

class Func
{
public:void operator()(int a = 10){while (a--){cout << "Func调用" << endl;}}
};

有了仿函数之后的优先级队列

namespace ZJ
{template<class T>class myless{public:bool operator() (const T& x, const T& y){return x < y;}};template<class T>class mygreater{public:bool operator() (const T& x, const T& y){return x > y;}};template<class T, class Container = vector<T>,class compare = myless<T>>class priority_queue{public: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 >= 0; i--){adjust_down(i);}}void adjust_up(int child){compare comfunc;size_t parent = (child - 1) / 2;while (child > 0){if (comfunc(_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 comfunc;size_t child = parent * 2 + 1;while (child<_con.size()){if (child + 1 < _con.size() && comfunc(_con[child] , _con[child + 1])){child = child + 1;}if (comfunc(_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;};
}

给出的对创建存储自定义类型的vector和存储自定义类型指针的vector的解释

在这里插入图片描述

编译器通过类型信息来确保您不会将非 Date* 类型的指针错误地插入到 a 中。如果您尝试将一个不是 Date* 类型的指针插入到a 中,编译器会发出一个错误,告诉您类型不匹配。所以当我们创建存储Date*类型的vector时,不需要调用Date的构造函数,只有在创建Date对象的时候,我们才需要调用Date的构造函数。

并且上述程序我们需要注意:程序结束时,只有局部对象(如a数组本身和任何在栈上分配的局部变量)的生命周期会结束,但由new在堆上分配的对象不会自动被销毁。你需要手动管理这些对象的生命周期。

在这里插入图片描述
在这里插入图片描述

5.2仿函数用法之自定义类型比较大小

priority_queue() = default;//生成默认的构造函数
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1): _year(year), _month(month), _day(day){}bool operator<(const Date& d)const{return (_year < d._year) ||(_year == d._year && _month < d._month) ||(_year == d._year && _month == d._month && _day < d._day);}bool operator>(const Date& d)const{return (_year > d._year) ||(_year == d._year && _month > d._month) ||(_year == d._year && _month == d._month && _day > d._day);}friend ostream& operator<<(ostream& _cout, const Date& d){_cout << d._year << "-" << d._month << "-" << d._day;return _cout;}
private:int _year;int _month;int _day;
};
struct PDateLess
{bool operator() (Date* p1, Date* p2){return *p1 < *p2;}
};
struct PDateMore
{//小堆bool operator() (Date* p1, Date* p2){return *p1 > *p2;}
};
void TestPriorityQueue()
{// 大堆,需要用户在自定义类型中提供<的重载ZJ::priority_queue<Date*,vector<Date*>,PDateMore> q1;q1.push(new Date(2018, 10, 29));q1.push(new Date(2018, 10, 28));q1.push(new Date(2018, 10, 30));while(!q1.empty()){cout << *q1.top() << endl;q1.pop();} 如果要创建小堆,需要用户提供>的重载//priority_queue<Date, vector<Date>, greater<Date>> q2;//q2.push(Date(2018, 10, 29));//q2.push(Date(2018, 10, 28));//q2.push(Date(2018, 10, 30));//cout << q2.top() << endl;
}
int main()
{TestPriorityQueue();return 0;
}

好啦,今天的内容我们就学习到这里,如果大家觉得阿鑫写的不错的话,记得留下你的一键三连哦,期待我们的下一次相遇!

相关文章:

list(二)和_stack_queue

嗨喽大家好&#xff0c;时隔许久阿鑫又给大家带来了新的博客&#xff0c;list的模拟实现&#xff08;二&#xff09;以及_stack_queue&#xff0c;下面让我们开始今天的学习吧&#xff01; list(二)和_stack_queue 1.list的构造函数 2.设计模式之适配器和迭代器 3.新容器de…...

查询SQL02:寻找用户推荐人

问题描述 找出那些 没有被 id 2 的客户 推荐 的客户的姓名。 以 任意顺序 返回结果表。 结果格式如下所示。 题目分析&#xff1a; 这题主要是要看这null值会不会用&#xff0c;如果说Java玩多了&#xff0c;你去写SQL时就会有问题。在SQL中判断是不是null值用的是is null或…...

2、Tomcat 线程模型详解

2、Tomcat 线程模型详解 Tomcat I/O模型详解Linux I/O模型详解I/O要解决什么问题Linux的I/O模型分类 Tomcat支持的 I/O 模型Tomcat I/O 模型如何选型 网络编程模型Reactor线程模型单 Reactor 单线程单 Reactor 多线程主从 Reactor 多线程 Tomcat NIO实现Tomcat 异步IO实现 Tomc…...

对硬盘的设想:纸存、执行存

固态硬盘出现后&#xff0c;发现它的擦写次数受限&#xff0c;越是便宜的固态硬盘&#xff0c;擦写次数越少。于是&#xff0c;有了“纸存”的设想&#xff0c;即硬盘上的单元只能改写一次&#xff0c;就像拿钢笔在纸上写字一样。这时&#xff0c;文件系统、数据库该怎么设计&a…...

最新付会进群多群同时变现社群系统V3.5.3版本 详细教程+源码下载

市面1888最新付费进群多群同时变现系统V3.5.3版本 详细教程源码下载介绍&#xff1a; 续男粉变现&#xff0c;相亲群变现后 演化出来的最新多群同时变现系统 可同时进行40个群同时变现 可设置地域群&#xff0c;相亲&#xff0c;男粉变现等多种群 购买后包括详细的 域名服…...

python tk实现标签切换页面

import tkinter as tk from tkinter import ttk# 初始化主窗口 root tk.Tk() root.title("标签页示例")# 设置窗口大小 root.geometry("400x300")# 创建 Notebook 小部件 notebook ttk.Notebook(root) notebook.pack(expandTrue, fill"both")#…...

引擎:UI

一、控件介绍 Button 按钮 创建一个按钮 按钮禁用 精灵模式 颜色模式 缩放模式 绑定点击事件 EditBox 输入框 Layout 布局 支持水平排列、垂直排列、背包排列 PageView 页面视图 ProgressBar 进度条 RichText 富文本 绑定点击事件 事件可以被其它标签包裹 图文混排 Scroll…...

Redis常见异常及优化方案

Redis常见异常及优化方案 Redis集群&#xff08;redis-cluster&#xff09;中的三主三从或者哨兵&#xff08;sentinel&#xff09;模式配置是一种常见的高可用架构&#xff0c;用于解决单点故障和提高数据可靠性。然而&#xff0c;即使在这样的配置下&#xff0c;仍然可能会遇…...

YOLOV5 图像分割:利用yolov5进行图像分割

1、介绍 本章将介绍yolov5的分割部分,其他的yolov5分类、检测项目参考之前的博文 分类:YOLOV5 分类:利用yolov5进行图像分类_yolov5 图像分类-CSDN博客 检测:YOLOV5 初体验:简单猫和老鼠数据集模型训练-CSDN博客 yolov5的分割和常规的分割项目有所区别,这里分割的结果…...

如何在Linux中使用Screen管理后台进程

如何在Linux中使用Screen管理后台进程 在Linux系统中&#xff0c;screen是一个非常有用的工具&#xff0c;它允许用户在一个终端窗口中创建多个虚拟终端&#xff0c;并且可以在这些终端之间切换&#xff0c;甚至可以在断开连接后重新连接到这些会话。这对于需要在后台运行长时…...

互联网轻量级框架整合之SpringMVC初始化及各组件工作原理

Spring MVC的初始化和流程 MVC理念的发展 SpringMVC是Spring提供给Web应用领域的框架设计&#xff0c;MVC分别是Model-View-Controller的缩写&#xff0c;它是一个设计理念&#xff0c;不仅仅存在于Java中&#xff0c;各类语言及开发均可用&#xff0c;其运转流程和各组件的应…...

【Android面试八股文】finally中的代码一定会执行吗?try里有return,finally还执行么?

文章目录 finally中的代码一定会执行吗?try里有return,finally还执行么?这道题想考察什么?考察的知识点考生应该如何回答验证特殊情况线程是守护线程遇到System.exit()finally中的代码一定会执行吗?try里有return,finally还执行么? 这道题想考察什么? 对Java语言的深…...

微服务第一轮

课程文档 目录 一、业务流程 1、登录 Controller中的接口&#xff1a; Service中的实现impl&#xff1a; Service中的实现impl所继承的接口IService&#xff08;各种方法&#xff09;&#xff1a; VO&#xff1a; DTO&#xff1a; 2、搜索商品 ​Controller中的接口&a…...

Linux 命令 FIO:深入理解磁盘性能测试工具

Linux 命令 FIO&#xff1a;深入理解磁盘性能测试工具 在 Linux 系统中&#xff0c;磁盘 I/O 性能对于系统的整体性能至关重要。为了准确、快速地评估磁盘性能&#xff0c;我们需要一个强大的工具来模拟各种磁盘读写场景。FIO&#xff08;Flexible I/O Tester&#xff09;就是…...

《精通ChatGPT:从入门到大师的Prompt指南》大纲目录

第一部分&#xff1a;入门指南 第1章&#xff1a;认识ChatGPT 1.1 ChatGPT是什么 1.2 ChatGPT的应用领域 1.3 为什么需要了解Prompt 第2章&#xff1a;Prompt的基本概念 2.1 什么是Prompt 2.2 好Prompt的特征 2.3 常见的Prompt类型 第二部分&#xff1a;Prompt设计技巧 第…...

Go_context包

是什么?为什么? context时goroutine之间传递上下文消息&#xff0c;包括信号取消&#xff0c;储存数据。 为什么&#xff1f; Go通常写后端服务&#xff0c;启动一个HTTP请求会启动多个goroutine&#xff0c;可以共享token数据。 或者处理时间长&#xff0c;通过停止信号关联…...

Mysql基础进阶速成版

一&#xff1a;sql语句&#xff1a; 1.创建一张表&#xff1a;写成公式&#xff1a;创建函数(create table)表名(配置字段)。配置字段公式:字段名称字段类型&#xff0c;常用的类型有&#xff1a;整数类型int(8),int(16),int(32).....&#xff0c;小数类型float(8),float(16).…...

Tomcat安装与配置要点和难点以及常见报错和解决方案

Tomcat 的安装及配置教程如下,将按照清晰的步骤进行说明: 一、安装前的准备 安装 JDK:Tomcat 是基于 Java 的 Web 服务器,因此需要先安装 JDK(Java Development Kit)。 你可以根据自己的操作系统选择适合的 JDK 版本,并确保它已正确安装和配置。 二、下载 Tomcat 访问 A…...

【Oracle】Oracle导入导出dmp文件

文章目录 前言一、什么是dmp&#xff1f;二、imp/impdp、exp/expdp对比及示例1.区别2.imp/impdp对比及示例a. impb. impbp 3.exp/expdp对比及示例a. expb.expdp 3.其他事项 三、执行导入导出前置条件1.创建角色并授权2.创建目录映射 前言 在工作中&#xff0c;经常会遇到需要备…...

渗透测试模拟实战-tomexam网络考试系统

渗透测试&#xff0c;也称为“pentest”或“道德黑客”&#xff0c;是一种模拟攻击的网络安全评估方法&#xff0c;旨在识别和利用系统中的安全漏洞。这种测试通常由专业的安全专家执行&#xff0c;他们使用各种技术和工具来尝试突破系统的防御&#xff0c;如网络、应用程序、主…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...