MyTinyStl源码刨析

2023-11-19

源码信息及目录

MyTinySTL-项目地址,该项目实现了C++的stl库,阅读该项目可以使我们对stl的底层有更深入的认识,同时可以增强我们的c++的内功。

在这里插入图片描述

MyTinySTL:主要实现stl的部分,包含迭代器iterator,分配器allocator,各种容器vector,list,map…,算法algorithms等。stl代码主要实现在MyTinySTL文件夹中

在这里插入图片描述

Test:主要涉及测试框架,用于测试各个容器以及算法的性能,整套代码的主函数main位于test.cpp中。作为项目的入口。

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

启动项目

项目采用Cmake编译启动运行,保证自己安装Cmake工具。

  • CMakeLists.txt的文件如下:涉及cmake编译的版本要求,项目名称,编译器的选择以及版本要求,以及编译子目录${PROJECT_SOURCE_DIR}/Test。

在这里插入图片描述

  • 编译步骤:

1.mkdir build
2.cd build
3. cmake …
4. make
5.cd bin/
6. ./stltest
即可看到输出窗口:

在这里插入图片描述

迭代器

  • 五种迭代器类型:

在这里插入图片描述

  • 萃取迭代器的特性:在下面的template中,Iterator代表迭代器类型,有了它我们可以撰写"运用迭代器种类或其他元素类型”的泛型码。

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

  • 萃取某个迭代器的 value_type

在这里插入图片描述

  • 萃取某个迭代器的 category种类

在这里插入图片描述

  • distance的实现,可以看出input_iterator_tag和random_access_iterator_tag类型的迭代器计算迭代器之间的distance实现实不同的,ransom是可以直接相减的,

在这里插入图片描述

  • advance用于让迭代器前进N个距离

在这里插入图片描述

  • 反向迭代器类的实现:可以看出,其内部有一个正向迭代器iterator成员current,运算符operator重载实现迭代器的移动。

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

分配器

Allocator提供一份接口,可满足分配,生成,销毁和回收对象,位于allocation.h以及construct.h两个文件共同实现。

在这里插入图片描述

  • 模板类allocator的定义

在这里插入图片描述

  • 分配一个数据的内存以及n个数据的内存实现:

在这里插入图片描述

  • 将ptr所指的元素初始化为value,传进来的value可能为左值或者右值

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

此处会判断类型有没有默认析构,如果是默认析构,什么都不做,否则会先进行析构。

在这里插入图片描述

算法

algobase.h,algo.h包含了大量的算法,可以查找自己想了解容器某个实现的算法。

在这里插入图片描述

容器实现

此处将vector容器拿出来讲解。

  • vector涉及的成员:begin_,end_,cap_

在这里插入图片描述

  • vector的迭代器本质上就是指

在这里插入图片描述- 构造、复制、移动、析构函数在这里插入图片描述
注意拷贝构造在实现的时候,会判断该类型是不是实现默认拷贝在这里插入图片描述在这里插入图片描述

  • 迭代器接口实现,容量接口略类似:

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

  • 获取元素的接口的实现:

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

  • 操作符重载实现:

在这里插入图片描述

测试框架Test

测试框架是检验整个代码的接口以及性能测试,定义了两个类 TestCase 和 UnitTest,以及一系列用于测试的宏

在这里插入图片描述

以vector测试文件为例:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyTinyStl源码刨析 的相关文章

  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问

随机推荐

  • 4.bio、request和request_queue

    通常一个bio对应上层传递给块层的I O请求 每个bio结构体实例及其包含的bvec iter bio vec结构体实例描述了该I O请求的开始扇区 数据方向 读还是写 数据放入的页 其定义如代码清单13 3所示 struct bvec i
  • Redis 分布式锁实现

    原文地址 http blog csdn net zhu tianwei article details 44927331 Redis是一个key value存储系统 和Memcached类似 但是解决了断电后数据完全丢失的情况 而且她支持更
  • 英文版线性代数笔记1

    是一个给自己期中复习做的笔记 第二课 关于矩阵 mxn的矩阵 是m行n列 先行后列 如A2 1 就是3 单位矩阵 关于向量 向量 有序有限的一列数字 定义 了解列向量 横向量 零向量 向量可以是一组解 关于单位向量 只有一个1 其他都是0
  • VC文件扩展名一览表

    VC文件扩展名一览表 2003 12 7 23 05 34 阅读589次 APS 存放二进制资源的中间文件 VC把当前资源文件转换成二进制格式 并存放在APS文件中 以加快资源装载速度 BMP 位图资源文件 BSC 浏览信息文件 由浏览信息
  • 西门子S7通信

    1 总体结构 1 1 西门子通信场景 在讨论更多的技术细节之前 首先我想简单介绍一下西门子通信场景的基本情况 当我谈到 S7协议 时 我指的是以太网S7通信 主要用于将PLC连接到 I PC站 PG PC PLC通信 不要将此与西门子设备使
  • okhttp源码分析

    Okhttp介绍 由square公司贡献的一个处理网络请求的开源项目 是目前Android使用最广泛的网络框架 从Android4 4开始HttpURLConnection的底层实现采用的是okhttp 项目地址 https github
  • 消息服务器 ws 高并发,HServer-JAVA: 基于Netty做的一个WebServer,同时集成MVC等相关快速开发功能的高并发服务器,做一些简单的应用分分钟搞定,同时性能报表...

    以下注解基本模拟Spring的功能 Bean 将Bean对象加入IOC容器中比如 按默名字加入IOC容器 Bean class TestService 指定名字加入容器 装配的时候就只能通过名字装配了 Bean testService cl
  • Element 修改el-table自带样式

    1 修改el table选中当前行高亮的样式 deep el table body tr current row gt td background color fff important 2 修改el table当前行的hover样式 de
  • 视觉SLAM漫谈

    视觉SLAM漫谈 1 前言 开始做SLAM 机器人同时定位与建图 研究已经近一年了 从一年级开始对这个方向产生兴趣 到现在为止 也算是对这个领域有了大致的了解 然而越了解 越觉得这个方向难度很大 总体来讲有以下几个原因 入门资料很少 虽然国
  • 22黑马QT笔记之事件全总结

    22黑马QT笔记之事件全总结 1 每个控件重写过滤器 event函数 各个事件处理函数都一样 都是先类中声明 类外定义 2 每个控件都可以重写事件过滤器 但是他一般写在窗口 安装时参数要求继承QObject嘛 event函数和各个事件处理函
  • Flutter状态管理Provider,简单上手

    学习Flutter一段时间了 偶然看到大家都说状态管理 多数人都是用redux 对于一个Android开发人员来说之前根本没接触过 于是开始了解redux 之后又了解闲鱼推出的fish redux 然后又看到Vadaski发表的一系列关于F
  • ChatBox安装--ChatGPT的桌面客户端

    ChatBox 是什么 是开源的 ChatGPT API OpenAI API 桌面客户端 Prompt 的调试与管理工具 支持 Windows Mac 和 Linux gt github地址 下载链接 支持的平台 Windows 请下载
  • 设置QFrame的背景图片并不影响其子控件的效果

    项目建立完成后 右键点你的项目 Add New gt QT Resource file 生成一个qrc文件 然后双击它 点add 然后Add Prefix 再Add file 完事之后build一下 在你的ui上点右键 gt Change
  • 选择软件外包公司需要注意哪些方面

    每个行业中不同公司的实力都是良莠不齐 特别是IT软件外包公司更是如此 当我们一旦将整个项目交付对方之后 项目的成败就全看软件外包公司的表现 风险极大 那么 我们该如何选择一家靠谱的深圳软件外包公司 选择软件外包公司需要注意哪些方面 北京木奇
  • 刷脸支付让城市真正迈入智能化数字化新阶段

    众所周知 每一次通信时代的变革都会催生一系列新兴事物的发展 比如3G时代的到来让越来越多国人开始了解互联网 4G时代的普及 让互联网产业得到了前所未有的发展空间 而5G时代的来临 将进一步推动数字化工作的进程刷脸支付正是如此 让城市真正迈入
  • 二分查找--中间值取值原则

    在数组总长度为奇数时 二分查找的中间值就是数组中间的那个元素 例如 对于长度为5的数组 中间元素的下标为2 在数组总长度为偶数时 二分查找的中间值有两个 可以取任意一个作为中间值 一种常用的方法是取靠左的那个中间值 例如 对于长度为6的数组
  • Image Processing图像处理(对比俩张图像的差异并且在图上标注出来)

    图像处理是构建所有计算机视觉的基础 按照我的图像处理指南使用OpenCV库学习计算机视觉的基础知识 SSIM进阶 利用python openCV将图片的差异性画框展示出来 诀窍是学习如何准确地确定在 x y 坐标位置上 图像的差异在哪里 使
  • shader学习网站

    https www shadertoy com https shaderfrog com http glslb in http glslsandbox com
  • Linux网络网卡配置相关知识记录

    Linux系统网络相关配置 1 网卡配置文件说明 2 使用 ifconfig 配置网卡 3 配置 DNS 地址 3 1 编辑 etc hosts 文件 在空白处输入 3 2 编辑 DNS 配置文件 4 确定 linux 服务器哪个网卡对应哪
  • MyTinyStl源码刨析

    文章目录 源码信息及目录 启动项目 迭代器 分配器 算法 容器实现 测试框架Test 源码信息及目录 MyTinySTL 项目地址 该项目实现了C 的stl库 阅读该项目可以使我们对stl的底层有更深入的认识 同时可以增强我们的c 的内功