迭代器--摘自STL源码剖析

STL源码剖析(侯杰)——读书笔记 文章目录STL源码剖析(侯杰)——读书笔记1. STL概论2.空间配置器SGI标准空间配置器, std::allocatorSGI特殊的空间配置器, std::alloc构造和析构 construct()和destroy()空间配置与释放3.迭代器概念与traits编程概念迭代器相应型别传递Traits编程技法——STL源码门钥Partial Specialization(偏特化)的意义std::iterator的保证4.序列式容器vector**list**dequestackqueueheappri 阅读详情


//myiterator
#ifndef _MYITERATOR
#define _MYITERATOR
//迭代器是一种智能指针
//首先利用继承关系定义五种迭代器类型
struct input_iterator_tag{};
struct out_put_tag{};
struct forward_iterator_tag:public input_iterator_tag{};
struct bidirectional_iterator_tag:public forward_iterator_tag{};
struct random_iterator_tag: public bidirectional_iterator_tag{};

//为了避免写代码时候漏写重要东西,自行开发的iterator最好继承以下iterator:
//每个iterator至少要提供以下五种信息:迭代器类型,所指对象型别,迭代器距离,
//所指对象的指针型及引用型
template<typename Category,typename T,typename Distance=ptrdiff_t,
	typename Pointer=T*,typename Reference=T&>
	struct iterator
	{
		typedef Category iterator_category;
		typedef T             value_type;
		typedef Distance   difference_type;
		typedef Pointer     pointer;
		typedef Reference reference;
	};
//每个iterator都应有traits来提供型别认证方面的能力
	template<typename Iterator>
	struct iterator_traits
	{
		typedef typename Iterator::iterator_category iterator_category;
		typedef typename Iterator::value_type            value_type;
		typedef typename Iterator::difference_type   difference_type;
		typedef typename Iterator::pointer                pointer;
		typedef typename Iterator::reference             reference;
	};
	//针对原生指针(native pointer)的traits的偏特化版本
	template<typename T>
	struct iterator_traits<T*>
	{
		typedef random_iterator_tag iterator_category;
		typedef T                              value_type;
		typedef ptrdiff_t                    difference_type;
		typedef T*                            pointer;
		typedef T&                            reference;
	};
	//针对原生的指向const的指针的偏特化:
	template<typename T>
	struct iterator_traits<const T*>
	{
		typedef random_iterator_tag iterator_category;
		typedef T                             value_type;
		typedef ptrdiff_t                   difference_type;
		typedef const T*                   pointer;
		typedef const T&                   reference;
	};
	//萃取迭代器类型的函数
	template<typename Iterator>
	inline typename iterator_traits<Iterator>::iterator_category
		iterator_category(const Iterator&)
	{
		typedef typename iterator_traits<Iterator>::iterator_category category;
		return category();
	}
//萃取迭代器difference_type类型的函数
	template<typename Iterator>
	inline typename iterator_traits<Iterator>::difference_type*
		distance_type(const Iterator&)
	{
		return static_cast<typename iterator_traits<Iterator>::difference_type*>(0) ;
	}
//萃取迭代器的value_type特性,返回的参数是指针,这样才能保证,得到的不是非常大的对象!
	template<typename Iterator>
	inline typename iterator_traits<Iterator>::value_type*
		value_type(const Iterator&)
	{
		return static_cast<typename iterator_traits<Iterator>::value_type*>(0) ;
	}
//---------------------------------------------------------------------------------------------
	//traits编程技法适度弥补了c++语言的不足,可以获得迭代器的信息,萃取迭代器特性;
	//__type_traits萃取型别的特性,获取型别是否具有non-trival 构造/析构/copy/赋值特性
	//如果没有的话,我们1可以采用最有效率的措施---内存直接处理操作;
	struct __true_type{};//表明trivial
	struct __false_type{};//表明non-trivial
	//这是最低保障,假设类型拥有non-triival的构造/析构/copy/赋值特性
	template<typename type>
	struct __type_traits
	{
		typedef __true_type this_dummy_member_must_be_first;
		/*他通知“有能力自动将__type_traits特化的”的编译器说,我们现在看到的
		 *__type_traits template 是特殊的。这是为了确保万一编译器也使用一个名为
		 *__type_traits时,仍然能正常运行
		 */
		typedef __false_type  has_trivial_default_constructor;
		typedef __false_type  has_trivial_copy_constructor;
		typedef __false_type  has_trivial_assignment_operator;
		typedef __false_type has_trivial_destructor;
		typedef __false_type  is_POD_type;
	};
	//以下为内置类型的特化
	template<>struct __type_traits<char>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<signed char>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<unsigned char>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<short>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<unsigned short>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<int>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<unsigned int>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<long>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<unsigned long>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<float>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<double>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<long double>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	//对原生指针偏特化
	template<typename T>
	struct __type_traits<T*>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
#endif


《STL源码剖析》学习之迭代器 在设计模式中有一种模式叫迭代器模式,简单来说就是提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素,这种设计思维在STL中得到了广泛的应用,是STL的关键所在,通过迭代器,容器和算法可以有机的粘合在一起,只要对算法给予不同的迭代器,就可以对不同容器进行相同的操作。 阅读详情

相关推荐

STL源码剖析总结

记录侯捷《STL源码剖析》感悟学习

qq_42579966的博客 1990

【STL源码剖析】从源码看 list:从迭代器到算法

本文深入剖析了STL中list容器的实现细节,适合已掌握C++模板和STL基础的开发者学习。文章从六个方面展开:概述list的优劣势;分析节点结构为双向循环链表;探讨迭代器设计与操作重载;揭示循环双向链表的数据结构;讲解构造与内存管理机制;介绍常用接口实现。重点解析了list通过哨兵节点实现"前闭后开"的特性,以及其特有的内存分配方式。文章通过源码分析,展示了STL中list的高效实现技巧,为开发者深入理解STL容器和数据结构提供了宝贵参考。

2401_87944878的博客 7960

【STL源码剖析】读书笔记

跳过吧在使用迭代器去“撮合”算法和容器时,需要知道容器对象的类型。由此,首先引入了function template参数推导机制,该方法解决了函数形参的推导,但是无法推导出函数的返回值类型。接着有介绍了class的内嵌类型声明,在类(或结构体)中通过typedef T value_type取得参数类型,然后让返回值类型为typename T::value_type获得T的参数类型,但这种方法只在class对象中有效,在原生指针中无法定义内嵌类型。此时,本章最重要的traits特性萃取机就闪亮登场了。

qq_47461884的博客 1354

STL源码剖析笔记——迭代器

STL源码剖析笔记——迭代器

weixin_48956191的博客 1199

STL源码剖析——STL算法之merge合并算法

本文介绍的STL算法中的merge合并算法,源码中介绍了函数merge、inplace_merge。并对这些函数的源码进行详细的剖析,并适当给出使用例子。

关注校招求职,微信号:job_campus 3157

STL源码剖析——STL算法之find查找算法

本文介绍的STL算法中的find、search查找算法。在STL源码中有关算法的函数大部分在本文介绍,包含findand find_if、adjacent_find、search、search_n、lower_bound、 upper_bound、 equal_range、binary_search、find_first_of、find_end相关算法,下面对这些算法的源码进行了详细的剖析,并且适当给出应用例子,增加我们对其理解,方便我们使用这些算法。

关注校招求职,微信号:job_campus 4062

【STL源码剖析】从源码看 vector:底层扩容逻辑与内存复用机制

本文深入剖析了STL中vector容器的实现原理,主要从四个方面展开:1)数据结构采用三个指针管理动态数组;2)迭代器直接使用原生指针实现;3)构造过程通过allocate_and_fill分配初始化空间;4)元素操作如push_back采用二倍扩容策略。帮助读者理解STL底层实现的价值,vector通过封装动态数组管理细节,为用户提供高效易用的接口。分析显示,vector的核心在于动态内存管理和高效扩容机制,适合已有STL基础的开发者深入理解其实现原理。

2401_87944878的博客 6604

vcpkg管理OpenCASCADE的5个高效技巧:从多版本共存到离线部署

本文详细介绍了使用vcpkg高效管理OpenCASCADE的5个实用技巧,包括多版本共存、性能优化、团队共享、CI/CD集成和离线部署。通过自动配置和版本控制,vcpkg显著简化了OpenCASCADE的开发环境管理,特别适合工业级CAD开发场景。

rain6的博客 187

STL-迭代器源码剖析

在接触了STL后,觉得STL就是一个为效率而生的怪物,而且令人惊讶的是它里面的很多算法和模板对于学C++的人来说是非常有价值去剖析的。        迭代器(Iterator)模式--提供一种方法,使之能够依序寻访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式。 STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一贴胶合剂(iterator)将它们撮合在一

如风 2257

MicroPython 开发ESP32应用教程 之 WIFI配网 Web页面配网 softAP 配网 web页面控制WS2812灯珠

MicroPython 开发ESP32应用教程 之 WIFI配网 Web页面配网 softAP 配网 web页面控制WS2812灯珠

weald2000的专栏 2080

ROS2学习笔记(二)-- 多机通讯原理简介及配置方法

简单介绍ROS2多机通信原理以及配置注意事项

aibingjin的博客 1万+

C++ STL源码剖析 8-iterator

在 C++ 标准模板库(STL)中,迭代器是一种抽象概念,用于提供对容器内元素的访问。迭代器可以视为指向容器中某个位置的指针,它封装了访问容器元素的方法。迭代器定义了对容器元素进行遍历、访问、插入和删除等操作的方式。T* data;return tmp;it!++it) {// 使用 *it 访问元素在这个示例中,我们定义了一个简单的容器,它包含一个简单的迭代器类。迭代器类提供了operator*operator->

wesigj的博客 1993

从“破解”到应用:三菱数控系统M80协议逆向分析与工业数据采集网关搭建指南

本文深入解析三菱数控系统M80协议的逆向分析方法与工业数据采集网关搭建技术。通过TCP协议实现跨平台通信,详细介绍了M80协议的数据包结构、多语言实现方案(C#、Java、C/C++)以及Linux数据采集网关的架构设计与容器化部署。为工业自动化领域的开发者提供从协议分析到企业级数据采集落地的完整解决方案。

weixin_29228781的博客 1212

【STL源码剖析】迭代器

STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后在以一胶合剂将它们连接在一起。auto_ptr是一种用来包装原生指针的对象,不需要自行释放内存,auto_ptr会自动释放内存,可以解决内存泄漏的问题 实现一个迭代器: 问题场景: 在算法中需要声明一个迭代器所指对象的类型(我们定义为value type)的变量,如何声明?解决办法: 利用function template的参数推导(argument deducation)机制在STL实现中,traits编程技术得到大量的运用,它利用了“内嵌类型

cloud的博客 1227

3DGS实战笔记:从相机坐标系到屏幕像素,手把手推导高斯椭球的投影变换矩阵

本文详细解析了3D高斯散射(3DGS)技术中从相机坐标系到屏幕像素的几何变换过程,重点推导了高斯椭球的投影变换矩阵。通过视图变换、投影变换和视口变换的完整流程,结合雅可比矩阵处理协方差矩阵,实现了高效的三维重建与渲染。文章提供了Python代码示例,帮助开发者深入理解3DGS的核心几何变换机制。

weixin_28691741的博客 438

机器人轨迹规划——三次样条轨迹1(基于速度的求解方法)

三次样条轨迹是利用三次样条曲线来对给定的一系列点进行插值,从而得到一个光滑的轨迹。三次样条因为每段的多项式次数最高都是三阶的,所以可以得到2阶导数连续,也就是加速度连续的轨迹。假设给定了一系列的点q0q1q2qnq0​q1​q2​...qn​,以及每个点对应的参数t0t1t2tnt0​t1​t2​...tn​,计算一条三次样条曲线sts(t)st,该曲线通过给定的点q0q1q2qnq0​q1。

出门搔白首,若负平生志 1471

STL源码剖析简体中文完整版学习资源:深度掌握STL内部实现

STL源码剖析简体中文完整版学习资源:深度掌握STL内部实现 【下载地址】STL源码剖析简体中文完整版学习资源 探索STL源码的奥秘,提升编程技能!本资源提供《STL源码剖析简体中文完整版》清晰扫描PDF,深入解析STL的容器、迭代器、算法等核心组件。通过学习,您将掌握vector、list、heap等容器的实现,理解红...

gitblog_06720的博客 1033

手把手教你学Simulink--基于Simulink的风力发电系统用双馈电机控制仿真建模

特点高效节能:在广泛的风速范围内保持高效的能量转换。独立控制有功和无功功率:通过控制转子电流实现对有功和无功功率的独立调节。较低的成本:相比直接驱动或全功率变流器方案,成本较低。挑战控制复杂度较高:需要复杂的控制算法来实现有功和无功功率的解耦控制。对电网波动敏感:需要良好的稳定性控制策略以应对电网电压波动。利用Simscape Electrical中的模块构建DFIG的物理模型,配置参数如电阻、电感、极对数等。matlab深色版本% 添加DFIG电机模块。

MHD0815的博客 347

C++ STL容器(三) —— 迭代器底层剖析

本篇聚焦于STL中的迭代器,同样基于MSVC源码。

hhhcbw的博客,欢迎各位来访 1539

innovus:insert Power Switch失败,报告not covered by a row问题解析

这个问题就是switch找不到可以放置的row,分析就从两方面入手,一方面从voltage area下手,一方面从row和site入手。检查发现voltage area设置正确,row也存在,只不过lef里缺少对应switch的双倍高的site。更多学习内容请关注「拾陆楼」知识星球。

m0_61544122的博客 1159

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SGL STL源码剖析——迭代器

SGL STL源码剖析——迭代器迭代器迭代器的型别Traits的作用迭代器相应的五种型别插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 迭代器 在我们使用STL容器的时候,迭代器是非常常见的,STL将容器和算法分开,彼此独立,然后通过迭代器相互关联。迭代器不是脱离容器存在的,每一种STL容

qq_31082639的博客 1077

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

STL源码剖析(一)STL简介

STL源码剖析(一)STL简介 文章目录STL源码剖析(一)STL简介一、STL概述二、STL六大组件2.1 容器(containers)2.2 算法(algorithms)2.3 迭代器(iterators)2.4 仿函数(functors)2.5 适配器(adapter)2.6 配置器(allocators)三、源码下载 一、STL概述 STL是Standard Template Librar...

JT同学的博客 1527

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

STL迭代器引发的崩溃问题

1、写符合C++规范的代码,通过基类指针析构子对象,没有虚析构函数是不符合规范的代码,不符合规范就容易坑你。2、STL的调试版迭代器还是很强大,这种防御性编程,能够帮你快速的定位到程序潜在的问题,否则无端的崩溃会让你怀疑人生。

leizhengshenglzs的博客 2593

STL源码剖析---list

相较于vector的连续线性空间,list就显得复杂许多,它的好处是每次插入或删除一个元素,就配置或释放一个元素空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素移除,list永远是常数时间。       list不仅是一个双向链表,而且还是一个环状双向链表。另外,还有一个重要性质,插入操作和接合操作都不会造成原有的list迭代器失效,这在vecto

Hackbuteer1的专栏 1万+

STL中迭代器的实现

 STL中迭代器的实现junguo           最近在看候捷先生的《STL源码剖析》,侯先生写的挺好的。但我读起来总感觉有些拗,理解起来有些费劲,可能他看问题的观点和我不一样造成的。开始的时候总是不太理解,后来理顺了自己的思路,发现有些东西其实并不难。在此把我对迭代器的理解整理一下,也是帮助自己消化一下,因为我发现不动手,很多东西容易遗忘。      文章里提供的一些例子程序是在D

junguo的专栏 1万+

STL源码剖析pdf高清版资源介绍:深入理解STL内部机制的宝藏书籍

STL源码剖析pdf高清版资源介绍:深入理解STL内部机制的宝藏书籍 【下载地址】STL源码剖析pdf高清版资源介绍 本仓库提供了《STL源码剖析》一书的高清版pdf资源,该书是深入理解STL(标准模板库)内部机制和实现原理的经典著作。通过非扫描的高清版本,您可以清晰阅读书中关于容器、迭代器、算法和函数对象等核心组件的详...

gitblog_06756的博客 811
上一篇: Allocate--摘自STL源码剖析
下一篇: 五种内存处理基本工具
wangyanphp
博客等级 码龄14年 90粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值