今天博主继续带来STL源码剖析专栏的第四篇博客了!
今天带来stack和queue的模拟实现!
话不多说,直接进入我们今天的内容!


前言

那么这里博主先安利一下一些干货满满的专栏啦!

手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm=1001.2014.3001.5482这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏https://blog.csdn.net/yu_cblog/category_11464817.html这里是STL源码剖析专栏,这个专栏将会持续更新STL各种容器的模拟实现。

STL源码剖析https://blog.csdn.net/yu_cblog/category_11983210.html?spm=1001.2014.3001.5482


什么是适配器?

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

比如std::stack,我们在使用的时候,可以取用vector适配,也可以用list适配。(其实stack在底层实现的时候会调用适配容器的push_back()和pop_back()等接口,只要适配容器具有这些接口,都可以当作适配器被调用!)

void test_stack() {
//stack<int,vector<int>>st; //适配 -- 传一个vector<int>类型过去
//stack<int, list<int>>st;
//vector和list其实底层已经完全变样了 -- 但是还是可以正常使用的
stack<int>st;
st.push(1);
st.push(2);
st.push(3);
st.push(4);
st.push(5); while (!st.empty()) {
cout << st.top() << endl;
st.pop();
}
}

STL里的stack和queue

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

std::deque

deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1)与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。
deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:

dequeue的迭代器构造是非常复杂的结构,同时也不是我们学习的重点,博主在这里不展开专门讲双端队列了,但是优先队列是非常重要的结构,博主会在下一期博客进行详细讲解!双端队列迭代器示意图如下:

tips:图片来自百度图片

Mystack.h

#pragma once
#include<vector>
#include<deque>
using namespace std; namespace yufc {
//template<class T> //现在这个还不是适配器因为底层是写死的
template<class T, class Container = deque<T>>
class stack {
public:
//构造析构拷贝构造要不要写 -- 不用
void push(const T& x) {
_con.push_back(x);
}
void pop() {
_con.pop_back();
}
T& top() {
return _con.back();
}
bool empty() const {
return _con.empty();
}
size_t size() const {
return _con.size();
}
private:
//vector<T>_con;
Container _con;
//我的Container到底是什么不重要,只需要它有这几个操作就行了
};
} //queue 双端队列
//1.支持任意位置的插入删除
//2.随机访问
//vector和list的合体 -- 看其实没有很牛 -- 外强中干 //优势:3D,头尾插入删除,随机访问
//设计缺陷:
//1.operator[]计算稍显复杂,大量使用性能下降
//2.中间插入删除效率不高
//3.迭代器会很复杂! //优先级队列
//priority_queue

MyQueue.h

#pragma once

#include<vector>
#include<deque>
using namespace std; namespace yufc {
template<class T, class Container = deque<T>>
class queue {
public:
void push(const T& x) {
_con.push_back(x);
}
void pop() {
_con.pop_front();
}
T& back() {
return _con.back();
}
T& front() {
return _con.front();
}
//const也可以补上
bool empty() const {
return _con.empty();
}
size_t size() const {
return _con.size();
}
private:
Container _con;
};
}

尾声

看到这里,相信大家对stack和queue的模拟实现已经有一定的了解了!这些容器的模拟实现,是我们掌握STL的开始,后面,博主将会给大家带来优先队列、map、set、哈希等等STL容器的模拟实现,持续关注,订阅专栏,点赞收藏都是我创作的最大动力。

转载时请注明作者和出处。未经许可,请勿用于商业用途 )
更多文章请访问我的主页

@背包https://blog.csdn.net/Yu_Cblog?type=blog

【STL源码剖析】stack_queue底层模拟实现 | 什么是适配器?【超详细的底层注释和解释】的更多相关文章

  1. STL"源码"剖析-重点知识总结

    STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...

  2. 【转载】STL"源码"剖析-重点知识总结

    原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点 ...

  3. (原创滴~)STL源码剖析读书总结1——GP和内存管理

    读完侯捷先生的<STL源码剖析>,感觉真如他本人所说的"庖丁解牛,恢恢乎游刃有余",STL底层的实现一览无余,给人一种自己的C++水平又提升了一个level的幻觉,呵呵 ...

  4. STL"源码"剖析

    STL"源码"剖析-重点知识总结   STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略 ...

  5. 《STL源码剖析》相关面试题总结

    原文链接:http://www.cnblogs.com/raichen/p/5817158.html 一.STL简介 STL提供六大组件,彼此可以组合套用: 容器容器就是各种数据结构,我就不多说,看看 ...

  6. 《STL源码剖析》读书笔记

    转载:https://www.cnblogs.com/xiaoyi115/p/3721922.html 直接逼入正题. Standard Template Library简称STL.STL可分为容器( ...

  7. STL源码剖析之空间配置器

    本文大致对STL中的空间配置器进行一个简单的讲解,由于只是一篇博客类型的文章,无法将源码表现到面面俱到,所以真正感兴趣的码农们可以从源码中或者<STL源码剖析>仔细了解一下. 1,为什么S ...

  8. STL源码剖析之组件

    本篇文章开始,进行STL源码剖析的一些知识点,后续系列笔记全是参照<STL源码剖析>进行学习记录的 STL在现在的大部分项目中,实用性已经没有Boost库好了,毕竟STL中仅仅提供了一些容 ...

  9. 面试题总结(三)、《STL源码剖析》相关面试题总结

    声明:本文主要探讨与STL实现相关的面试题,主要参考侯捷的<STL源码剖析>,每一个知识点讨论力求简洁,便于记忆,但讨论深度有限,如要深入研究可点击参考链接,希望对正在找工作的同学有点帮助 ...

  10. 通读《STL源码剖析》之后的一点读书笔记

    直接逼入正题. Standard Template Library简称STL.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adap ...

随机推荐

  1. AtCoder Regular Contest 116 (A~F补题记录)

    补题链接:Here 第一次打 ARC,被数学题虐惨了 赛后部分数学证明学习自 ACwisher A - Odd vs Even \(T(1≤T≤2×10^5)\)组测试数据,每次询问一个正整数 \(N ...

  2. 供应链安全情报 | cURL最新远程堆溢出漏洞复现与修复建议

    漏洞概述 cURL 是一个支持多种网络协议的开源项目,被广泛集成到自动化构建.网络测试.网络数据采集以及其他网络相关的任务中,备受开发者和系统管理员青睐. cURL在2023年10月11日下午紧急发布 ...

  3. 【收藏】制作艺术二维码,用 Stable Diffusion 就行!

    [收藏]Stable Diffusion 制作光影文字效果 https://www.cnblogs.com/Serverless/p/17620406.html 基于函数计算FC 快捷部署 Stabl ...

  4. STM32CubeMX教程18 DAC - DMA输出自定义波形

    1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) 野火DAP仿真器 keil µVision5 IDE(MDK-Arm ...

  5. git速查

  6. 在Python中使用Process创建子进程遇到的问题

    假如使用Process创建子进程,那么在最后的函数调用时需要加上if __name__ == "__main__":语句,否则会报错. 未使用该语句 代码示例 from multi ...

  7. Redis在Liunx系统下使用

    Redis使用 前言 如何在Linux服务器上部署Redis,版本号如下: Redis版本 5.0.4 服务器版本 Linux CentOS 7.6 64位 下载Redis 进入官网找到下载地址 ht ...

  8. ingress nginx 支持的K8S版本以及nginx版本信息

  9. [转帖]SQL Server数据库重建索引、更新统计信息

    https://vip.kingdee.com/article/183932?productLineId=8 SQL Server数据库有时由于长期未做索引重建,导致SQL执行效率下降,当表的索引碎片 ...

  10. [转帖]Windows下sc create命令行注册服务

    https://www.cnblogs.com/li150dan/p/15603149.html 如何将exe注册为windows服务,让其直接从后台运行 方法一:使用windows自带的命令sc,首 ...