MyTinySTL 简单分析(一)--iterator.h

MyTinySTL 简单分析

目前在学习STL,看到一个开源的项目MyTinySTL,非常不错。想着照着这个代码自己敲一遍应该也能有些进步。然后就开始了学习过程。

首先分析的是vector

以下是由vector.h关联的所有头文件

其中有几个文件是重复的,例如type_traits.h 等

下面是一一分析每个文件。

  1. type_traits.h

这个文件比较简单,主要定义了两个结构体

m_true_type
m_false_type

这两个都从下面这个结构体继承而来,

struct m_integral_constant
{
   static constexpr T value = v;
};

所以都有一个value值,分别是true,false;

然后还定义了is_pair

2. iterator.h

这个文件是迭代器

下面两个链接讲的比较清楚

MyTinySTL学习之迭代器:iterator.h(一) - 掘金

https://juejin.cn/post/7110201852053946404

首先,迭代器需要associate type(一共五个)

这五个associated type 的作用如下:

这5个iterator的associated type分别可以回答算法以下5个问题

  • iterator_category:迭代器的类型(决定了迭代器可以怎么走,例如vector的迭代器可以随机访问,而链表的迭代器一次只能走一步)
  • value_type:迭代器所指容器中元素的类型
  • difference_type:迭代器距离范围(即迭代器相减结果的范围)对应的类型,一般是内置类型ptrdiff_t,(eg.如果容器的容量范围是[0,232-1],则可以将difference_type定义为unsigned int)
  • reference:迭代器所指容器中元素的引用类型
  • pointer:迭代器所指容器中元素的指针类型 【NOTE】:每个容器都要实现自己的迭代器,为什么要在iterator.h中定义上面这段代码?
  • 如何获取迭代器的associated type? iterator_traits盛大出场!
  • 由于算法和容器之间是通过iterator来交互的,算法工作的时候需要知道的详细信息就是通过iterator,所以iterator 就定义了公共的接口和类型,
  • 在实际中,不只class可以作为iterator,基本类型如int也可以作为iterator。class iterator 可以定义如上几个associated type,但是基本类型没有,所以这是需要iterator_traits 来统一。

iterator_traits_impl有两个定义,如果第二个模板参数为true时,则定义了五个类型,否则为空。

iterator_traits_helper也有两个定义,如果第一个模板参数Iterator的iterator_category

input_iterator_tag 或 output_iterator_tag 时,则从上面定义了五个iterator_traits_impl继承。否则继承上面空的iterator_traits_impl,也为空

 iterator_traits 继承自iterator_traits_helper,继承时传递的第二个模板参数使用了has_iterator_cat<Iterator::value

has_iterator_cat 的value值是怎么来的呢?

// iterator traits
template <class T>
struct has_iterator_cat
{
private:struct two {char a; char b;};template <class U> static two test(...);template <class U> static char test(typename U::iterator_category* = 0);public:static const bool value = sizeof(test<T>(0)) == sizeof(char);// 如果传进来的T有iterator_category, 则会进入第二个test,返回的是char,则value 为true
};

根据它的定义,它有两个函数,分别返回two体和char,two结构体有两个char,如果传进来的模板参数Iter有iterator_category,则返回char,那么成员变量value则为true,否则为false。

这样一来iterator_traits 传进来的Iterator,如果有category,则会包含上面iterator_traits_impl的五个类型。

另外 iterator_traits 实现了两个偏特化版本。

到此iterator_traits可以完美的在任何情况下都能萃取出不同iterator的五个associated_type

========================

萃取出了迭代器,下面需要判断是哪种类型的迭代器,即

is_input_iteratoris_output_iteratoris_forward_iterator

is_bidirectional_iteratoris_random_access_iterator

这五个都继承自has_iterator_cat_of, 而这个has_iterator_cat_of 继承自m_bool_constant,其中会含有true 或false

has_iterator_cat_of, 根据第三个模板参数,有两个定义,

1)没有第三个模板参数,则继承自m_false_type, 那么value就是false

2)存在第三个模板参数,则正常继承,第一个目标参数的iterator_category 是否可以可以相互转化为第二个模板参数U作为父类m_bool_constant的参数

========================

再后面就是定义了萃取某个迭代器的category, distance_type, value_type,等

===================

再后面定义了计算iterator的距离,让iterator往前后走等

================

最后定义了一个reverse_iterator,主要实现了前进变后退,后退变前进。

=====================

综上,以上便是对iterator.h 的分析

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

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

相关文章

智能光栅光片显微成像技术的LabVIEW解决方案

智能光栅光片显微成像技术的LabVIEW解决方案 在生物医学研究中&#xff0c;高效的成像技术对于捕捉细胞内罕见和复杂事件至关重要。智能光栅光片显微技术&#xff08;smartLLSM&#xff09;的出现&#xff0c;代表了LabVIEW软件在高端成像领域的革命性应用&#xff0c;这项技术…

solr 远程命令执行漏洞复现 (CVE-2019-17558)

solr 远程命令执行漏洞复现 (CVE-2019-17558) ‍ 名称: solr 远程命令执行 (CVE-2019-17558) 描述: Apache Velocity是一个基于Java的模板引擎&#xff0c;它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Apache基金会旗下的一个开源软件项目&#xff0c;旨在确…

Qt 快捷键设置

以 “在编辑时自动补齐”快捷键 为例&#xff1a; 位置&#xff1a;红色 搜索快捷键&#xff1a;蓝色 修改方式&#xff1a;绿色 快捷键&#xff1a;黄色

22k+star炒鸡好用的开源的网盘神器FileBrowser Docker自建个人网盘神器教程

目录 简介 1.拉取镜像 2.创建并启动容器 2.1创建目录 2.2启初始化一个容器用于导出配置文件和数据库&#xff0c;只挂载数据目录 2.3先将数据库文件和配置文件复制出来 2.4停止容器并删除容器 2.5创建完整的容器 3.愉快地使用 3.1示例&#xff1a; 3.2图片预览 3.3json…

基于Java SSM框架实现学生综合考评管理系统项目【项目源码+论文说明】

基于java的SSM框架实现学生学生综合考评管理系统演示 摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 学生综合考评管理系统&#xff0c;主要的模块包括查看&#xff1b;管理员&#xff1b;个…

鸿蒙HarmonyOS实战-工具安装和Helloworld案例

&#x1f680;前言 HarmonyOS是华为自主开发的操作系统&#xff0c;它在2020年9月正式发布。它最初被称为鸿蒙OS&#xff0c;后来更名为HarmonyOS。HarmonyOS旨在提供一种可在各种设备上无缝运行的统一操作系统&#xff0c;包括智能手机、平板电脑、智能穿戴设备、智能音箱、车…

“核弹级“攻击队视角下的监管痛点解决方案

痛点分析及解决方案 一、辖区企业资产分散且不透明 - 传统的监管体系中&#xff0c;政府监管单位往往面临着辖区企业资产分散且不透明的问题。 - 企业无法梳理自身资产&#xff0c;上报的资产台账无法涵盖全部自身资产 - 监管单位精力有限&#xff0c;无法保证辖区企业资产台账…

工信部颁发的人工智能证书《自然语言与语音处理设计开发工程师》证书到手啦!

工信部颁发的人工智能证书《自然语言与语音处理设计开发工程师》证书拿到手啦&#xff01; 近期正在报考的工信部颁发的人工智能证书还有&#xff1a; 《计算机视觉处理设计开发工程师》中级 2024年1月24日至28日-北京 《自然语言与语音处理设计开发工程师》中级 第二期 20…

高级分布式系统-第15讲 分布式机器学习--分布式机器学习算法

高级分布式系统汇总&#xff1a;高级分布式系统目录汇总-CSDN博客 分布式机器学习算法 按照通信步调&#xff0c;大致可以分为同步算法和异步算法两大类。 同步算法下&#xff0c;通信过程中有一个显式的全局同步状态&#xff0c;称之为同步屏障。当工作节点运行到同步屏障 …

定位Linux下写句柄错误问题

编写代码时发现对于以下can 写资源句柄时出现的错误不是很能分析&#xff0c;但是如果将错误码打印出来后&#xff0c;清晰了很多&#xff0c;并且还可以查看。 int Can::Write(const struct can_frame *send_frame) { int result;std::cout << "before write s_ :…

JUC——8锁问题

文章目录 问题一和问题二&#xff1a;问题三&#xff1a;问题四&#xff1a;问题五和问题六&#xff1a;问题七和问题八&#xff1a;总结 八锁现象是在多线程编程中经常遇到的一种情况&#xff0c;指的是在使用synchronized关键字进行同步时可能出现的不同的执行顺序。下面对问…

C++ 类的静态成员

我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时&#xff0c;这意味着无论创建多少个类的对象&#xff0c;静态成员都只有一个副本。 静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句&#xff0c;在创建第一个对象时&#xff0…

JNPF低代码引擎到底是什么?

最近听说一款可以免费部署本地进行试用的低代码引擎&#xff0c;源码上支持100%源码&#xff0c;提供的功能和技术支持比较完善。借助这篇篇幅我们了解下JNPF到底是什么&#xff1f; JNPF开发平台是一款PaaS服务为核心的零代码开发平台&#xff0c;平台提供了多租户账号管理、主…

Linux中的定时任务(案例:定时备份和清空)

前言 Linux中的定时任务&#xff08;案例&#xff1a;定时备份和清空&#xff09; crontab 命令 Linux crontab 是用来定期执行程序的命令, 当安装完成操作系统之后&#xff0c;默认便会启动此任务调度命令。crond 命令每分钟会定期检查是否有要执行的工作&#xff0c;如果有…

数据结构:二分图

参考链接&#xff1a; https://zhuanlan.zhihu.com/p/96229700 Bipartite Graph Definition G &#xff08;U, V, E&#xff09;all the edges are between U and V.No edge between two vertices in U.No edge between two vertices in V. Bipartite Matching G (U, V…

适配器模式介绍

目录 一、适配器模式介绍 1.1 适配器模式定义 1.2 适配器模式原理 1.2.1 适配器模式类图 1.2.2 模式角色说明 二、适配器模式的应用 2.1 类适配器模式 2.1.1 需求说明 2.1.2 需求实现 2.1.2.1 类图 2.1.2.2 具体实现 2.1.2.2.1 SDCard接口 2.1.2.2.2 SDCardImpl实现…

Intra-Inter Camera Similarity for Unsupervised Person Re-Identification

一、研究背景 1.由于人工标注样本昂贵&#xff0c;许多工作致力于通过以下手段进行无监督行人重识别&#xff1a; 域自适应&#xff1a;对齐源域、目标域特征分布 风格转换&#xff1a;使用生成对抗网络转换源域图片风格&#xff0c;并维持源域图片身份 伪标签生成&#xff1a;…

java.lang.UnsupportedOperationException: null 其一解决办法

文章目录 前言一、错误回顾1.详细信息2.代码详情 二、解决方案1.错误原因2.解决方案1.使用 new ObjectMapper() new TypeReference<List>(){}2.使用 SerializerFeature.WriteMapNullValue.getMask() 总结 前言 当我们远程调用传递泛型集合&#xff0c;如 List<?>…

【重明】机器视觉QT/C++实现工业相机二次开发框架

工业相机二次开发是机器视觉行业必不可少的技能之一。 而如何实现一个框架&#xff0c;能够兼容所有工业相机二次开发&#xff0c;从而支持多种类型的工业相机&#xff0c;就是机器视觉行业的进阶技能了。 重明工业相机二次开发项目就是在实现相机二开框架的基础上&#xff0c…

解决方案:reactNative通过webview跳转微信智能客服空白webview页面

在reactNative中使用webview跳转微信智能客服&#xff0c;功能正常&#xff0c;从微信退回到App时&#xff0c;会有一个空白的webview页面&#xff0c;在使用感觉上不是那么的顺滑。解决这个可以在webview中使用onLoadEnd方法来解决这个问题 在react-native-webview中onLoadEn…