C++从零开始的打怪升级之路(day38)

这是关于一个普通双非本科大一学生的C++的学习记录贴

在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料

那么开启正题

今天分享的是关于适配器了解以及一些简单适配器实现

1.容器适配器

1.1什么是适配器

适配器是一中设计模式(设计模式是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另一个接口

也就是我们常说的复用

1.2deque

虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和queue只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque

deque又叫双端队列,大致性质就是一个指针数组,每个指针对应一段空间,如果数据存满了需要再存数据,只需再开一个指针,如果需要扩容也只是指针数组需要扩容,但是deque的迭代器相当复杂,有四个指针,这里不展开分析

明明我们有vector和list,为什么需要deque这个容器呢

deque的优点:支持随机访问,头插头删效率高,这很好得弥补了list和vector的不足,那deque可以取而代之吗,答案显而易见,我们来看deque的缺点

deque的缺点:【】效率低,由于迭代器复杂,和本身复杂的结构,使deque的大量随机访问效率低,大概是vector时间的4~5倍,但是在stack,queue中并没有体现到他的缺陷,因此STL中的默认容器选择了它

2.stack的模拟实现

根据stack先进后出的性质我们可以借助vector或者deque模拟实现

namespace wkl
{template<class T, class Container = deque<T>>class stack{public:stack(){;}void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}T& top(){return _con.back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};void Test_stack(){stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;}
}

这是模拟实现代码,以及测试性质函数

3.queue的模拟实现

根据queue先进后出的性质我们可以借助list或者deque模拟实现

namespace wkl
{template<class T, class Container = deque<T>>class queue{public:queue(){;}void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}T& back(){return _con.back();}T& front(){return _con.front();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};void Test_queue(){queue<int> q;q.push(1);q.push(2);q.push(3);q.push(4);while (!q.empty()){cout << q.front() << " ";q.pop();}cout << endl;}
}

这是模拟实现代码,以及测试性质函数

4.priority_queue

4.1仿函数

在了解priority_queue之前我们需要先了解仿函数

我们来看下面的代码

namespace wkl
{template<class T>struct less{bool operator()(const T& x1, const T& x2){return x1 < x2;}};void Test_less(){less<int> l;cout << l(1, 2) << endl;}
}

cout << l(1, 2) << endl;这一行代码看起来很像函数调用,但实际上不是的

他是根据对象的operator()对()进行重载,再调用函数,因为看起来像函数,因此被称为仿函数

仿函数属于STL的四大容器之一

4.2priority_queue的模拟实现

优先级队列也是一种适配器,优先级队列的底层实际上是由堆来实现的,我们这里用vector来模拟实现

namespace wkl
{//仿函数 函数对象 (对象可以和函数一样调用)template<class T>struct less{bool operator()(const T& x1, const T& x2){return x1 < x2;}};template<class T>struct greater{bool operator()(const T& x1, const T& x2){return x1 > x2;}};template<class T, class Container = vector<T>, class Comapre = less<T>>class priority_queue  //默认是大堆{public:Comapre com;void AdjustUp(int child){int parent = (child - 1) / 2;while (child > 0){//if (_con[child] > _con[parent])if (com(_con[parent], _con[child])){swap(_con[child], _con[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}}void push(const T& x){_con.push_back(x);AdjustUp(_con.size() - 1);}void AdjustDown(int root){Comapre com;int parent = root;int child = parent * 2 + 1;while (child < _con.size()){//if (child + 1 < _con.size() && _con[child + 1] > _con[child])if (child + 1 < _con.size() && com(_con[child], _con[child + 1])){++child;}//if (_con[child] > _con[parent])if (com(_con[parent], _con[child])){swap(_con[child], _con[parent]);parent = child;child = parent * 2 + 1;}else{break;}}}void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back();AdjustDown(0);}T& top(){return _con[0];}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};void Test_priority_queue(){priority_queue<int> pq;pq.push(9);pq.push(3);pq.push(7);pq.push(0);while (!pq.empty()){cout << pq.top() << " ";pq.pop();}cout << endl;}
}

这是模拟实现代码,以及测试性质函数

 新手写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!!

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

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

相关文章

python基础——基础语法

文章目录 一、基础知识1、字面量2、常用值类型3、注释4、输入输出5、数据类型转换6、其他 二、字符串拓展1、字符串定义2、字符串拼接3、字符串格式化4、格式化精度控制 三、条件/循环语句1、if2、while3、for循环 四、函数1、函数定义2、函数说明文档3、global关键字 五、数据…

Docker Register 搭建私有镜像仓库

1 安装 docker (1)更新软件源 sudo apt update (2)安装 docker 组件 sudo apt install docker.io (3)启动 docker 服务 sudo systemctl start docker (4)设置 docker 服务开机自启动 sudo systemctl enable docker (5)验证 docker 功能 sudo docker contai…

代码随想录 回溯算法-组合

目录 77.组合 216.组合总和||| 17.电话号码的字母组合 39.组合总和 40.组合总和|| 77.组合 77. 组合 中等 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4…

【论文精读】大语言模型融合知识图谱的问答系统研究

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

一文看懂 | 机器视觉前景

机器视觉概述&#xff1a;机器视觉是人工智能发展中的一个重要分支&#xff0c;其主要目标是用机器替代人眼进行测量和判断。 机器视觉系统通过图像摄取装置将目标转换成图像信号&#xff0c;然后传送给专用的图像处理系统&#xff0c;最终得到目标的形态信息。 全球机器视觉…

链路负载均衡之策略路由

一、策略路由的概念 一般来说&#xff0c;防火墙是根据目的地址查看路由&#xff0c;这种情况下只能根据报文的目的地址为用户提供服务&#xff0c;没办法更加灵活对内网用户进行区分&#xff0c;让不同用户流量走不同的链路转发&#xff0c;如根据源地址、应用协议等区分流量…

照片 200K 的尺寸是多大?如何调整照片到200k?

在数字时代&#xff0c;我们经常需要在互联网上上传和分享照片。在上传照片时&#xff0c;我们常常会遇到文件大小的限制&#xff0c;通常以“K”&#xff08;千字节&#xff09;为单位。如果您需要上传的照片大小为 200K&#xff0c;那么它的实际尺寸是多大呢&#xff1f;本文…

卫星通信基础知识

为了满足日益增长的卫星业务需求&#xff0c;多路径路由被用来通过多个传输路径并发地传输每个流。然而&#xff0c;动态变化的卫星拓扑结构带来了挑战&#xff0c;多路径路由规划和不同路径之间的业务分裂。 因此&#xff0c;在本文中&#xff0c;我们提出了一个GNN启用多路径…

栈【stack】 栈的【STL】运用 【单调栈】 【单调栈】的详细解释【图文讲解】 洛谷P5788 【模板】单调栈 【单调队列】

文章目录 栈的定义栈的STL运用 单调栈 & 单调队列单调栈的详细解释【图文讲解】例题&#xff1a;洛谷P5788 【模板】单调栈code↓洛谷P5788 【模板】单调栈 AC 栈的定义 栈的修改与访问是按照后进先出的原则进行的 栈通常被称为是后进先出&#xff08;last in first out&…

centos ps命令

1. ps &#xff1a; Process Status的缩写&#xff0c;用于查询系统的进程状态 2. 常用参数&#xff1a;-ef 返回系统中所有用户的所有进程的完整列表 -A 显示所有进程&#xff08;同-e&#xff09; -a 显示当前终端的所有进程 -u 显示进程的用户信息 -o 以用户…

33、一致性哈希算法分区

33、一致性哈希算法分区 一、背景二、介绍三、步骤1、算法构建一致性哈希环2、Redis服务器IP节点映射3、key落到服务器的落键规则 四、优点1、一致性哈希算法的容错性2、一致性哈希算法的扩展性 五、缺点1、一致性哈希算法的数据倾斜问题2、拓展 六、总结 一、背景 一致性哈希…

sylar高性能服务器-日志(P57-P60)内容记录

文章目录 P57-P60&#xff1a;序列化模块Varint&#xff08;编码&#xff09;Zigzag&#xff08;压缩&#xff09;class ByteArrayNode&#xff08;链表结构&#xff09;成员变量构造函数写入读取setPositionaddCapacity 测试 P57-P60&#xff1a;序列化模块 ​ 序列化模块通常…

LeetCode2643. Row With Maximum Ones

文章目录 一、题目二、题解 一、题目 Given a m x n binary matrix mat, find the 0-indexed position of the row that contains the maximum count of ones, and the number of ones in that row. In case there are multiple rows that have the maximum count of ones, t…

某酷ckey140逆向(之前下架了重新上传补发)

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018…

Win UI3开发笔记(六)设置软件最小尺寸

想设置最小尺寸为1000*100像素怎么做&#xff1f; 一、问gpt using Microsoft.UI.ViewManagement; using Windows.UI.ViewManagement;// 在应用程序启动时设置最小缩放尺寸 ApplicationView.PreferredLaunchViewSize new Size { Width 800, Height 600 }; ApplicationView.P…

代码随想录算法训练营(动态规划10,11 ,12 股票问题)| 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

动态规划10 动态规划5步曲&#xff0c;个人感觉应该加一步状态分析 状态分析&#xff1a; 列出所有的状态&#xff0c;将状态归纳后定义dp数组状态转移&#xff0c;状态怎么转移也就是递推公式是什么 买卖股票的动规五部曲分析如下&#xff1a; 1 确定dp数组&#xff08;d…

Python - Pycharm 配置 autopep8 并设置快捷键

什么是 PEP8 官方&#xff1a;PEP 8 – Style Guide for Python Code | peps.python.org PEP8 是 Python 官方推出的一套编码的规范&#xff0c;只要代码不符合它的规范&#xff0c;就会有相应的提示&#xff0c;还可以让代码自动的格式化 Pycharm 自带的代码格式化 ​ 但这…

2024年Android笔试题总,如何系统全面性学习Android语言

开头 让我们一起来看看&#xff0c;字节跳动的第三面&#xff0c;面试官都问了什么&#xff1f;&#xff08;第一二面的题目及答案已整理&#xff0c;需要的可以在文末领取&#xff09; 从七月中旬开始&#xff0c;我前前后后差不多一共投递了八十份简历&#xff0c;到目前为…

游戏网站为了提升谷歌的搜索排名,应该在html等方面做什么优化?

一&#xff1a;为了提升谷歌的搜索排名&#xff0c;游戏网站可以在HTML等方面进行以下优化&#xff1a; 关键词优化&#xff1a;在HTML的标题标签&#xff08;<title>&#xff09;和Meta标签中包含与游戏相关的关键词&#xff0c;以便搜索引擎能够更好地理解网站内容。 …

PyTorch笔记:标量向量矩阵张量+维度+常用API+计算图+自动微分计算

PyTorch 张量 默认数据类型是torch.float32 维度 0&#xff1a;标量1&#xff1a;向量2&#xff1a;矩阵… 标量&向量&矩阵&张量 标量&#xff1a;0维空间中一个点向量&#xff1a;1维空间中一条线矩阵&#xff1a;2维空间中一个面三维张量&#xff1a;三维空…