泛读《STL源码剖析》第三章:迭代器概念与traits编程技法_z-k的博客-程序员宅基地

技术标签: 《STL源码剖析》  traits  迭代器  STL  

迭代器作用

STL中,算法和容器是分开的,彼此独立,通过迭代器联系在一起

迭代器的设计,就是为了在不暴露容器的内部表达式的前提下让算法能够遍历容器的各个元素

 

traits技法的引出

迭代器是一种类似指针的对象,最重要的便是对operator *和operator ->进行重载,为了让迭代器适用于任何型态的结点,需要把它设计为class template

在算法中运用迭代器,很可能会用到其相应型别,而C++之支持sizeof( ),并未支持typeof( ),即便动用RTTI性质中的typeid( ),获得的也只是型别的别名,不能用来当变量声明用

解救的办法有几个

①利用function template的参数推导机制

但是,template参数推导机制推导的只是参数,无法推导返回值型别,所以只能采用声明内嵌型别的方法

看起来不错,但却有个陷阱:并非所有的迭代器都是class type,原生指针就不是,如果不是class type,就无法在类中定义内嵌型别,所以上面这样还不够,还需要引入trait技法

②traits技法

不通过声明内嵌型别,而是直接采用另外一个类来把迭代器的型别给提取出来

traits中通过类的偏特化(partial specialization)特性,可以将原生指针偏特化,这样就弥补了上面无法识别原生指针的缺点

详细见:https://blog.csdn.net/qq100440110/article/details/51854673

最常见的迭代器型别有5种value_type、difference_type、pointer、reference、iterator_category,因此traits中会有这5个类型

我们直接把原生指针或迭代器扔进traits中,便可得到对应的型别

 

迭代器相应型别

  1. value_type:所指对象的型别
  2. difference_type:两个迭代器之间的距离
  3. reference type与pointer type(见下图)
  4. iterator_category:迭代器种类

 

根据迭特性与施行操作,迭代器被分为五类:

  • Input Iterator:这种迭代器所指对象,不允许外界改变。只读(read only)。
  • Output Iterator:唯写(write only)。
  • Forward Iterator:允许「写入型」算法(例如 replace() )在此种迭代器所形成的区间上做读写动作。
  • Bidirectional Iterator:可双向移动。某些算法需要逆向走访某个迭代器区间(例如逆向拷贝某范围内的元素),就可以使用 Bidirectional Iterators。
  • Random Access Iterator:前四种迭代器都只供应一部份指标算术能力(前三种支持 operator++ ,第四种再加上 operator-- ),第五种则涵盖所有指标算术能力,包括 p+n, p-n, p[n], p1-p2, p1<p2 

它们之间的继承关系如下,Output Iterator独立开来

 

iterator的保证

为符合规范,任何迭代器都应该提供5个内嵌相应型别,以利于traits的萃取,实际实现中,STL提供了一个iterator class,每个迭代器都继承自它,就可保证符合规范

iterator class 不含任何成员,纯粹只是型别定义,所以继承它并不会招致任何额外负担。由于后三个参数皆有默认值,新的迭代器只需提供前两个参数即可

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40673608/article/details/86741565

智能推荐

linux上配置nginx反向代理_qq1094409128的博客-程序员宅基地

1、正向代理场景:A向B借钱–&gt;B不借–&gt;A发现C和B关系很好(A和C关系很好)–&gt;A拜托C向B借钱(不要说是我借的)–&gt;C就找B借钱–&gt;B把钱借给C–&gt;C把钱给A–&gt;B并不知道谁真正在向自己借钱–&gt;A达到了自己的目的定义:客户端向真实的服务器端发送请求,但是出于某种原因无法向真实的客户端发送请求,客户端就找到代理服务器,把请求发送给代理服务...

时序模型预测结果:DM检验含义与python实现_呆萌的代Ma-程序员宅基地_dm检验

文章目录DM检验概述Python代码使用DM检验概述DM检验通常用于对比两个时间序列预测模型的预测结果,判断哪一个模型的预测结果更优。假设:H0:两个模型具有相同的预测结果H1:两个模型的预测结果不同p值:&gt; 0.05时接收原假设,意味着两个模型效果相同&lt; 0.05时拒绝原假设,意味着两个模型效果不同DM值(需要p&lt;0.05时这个指标才有意义):&gt; 0时模型1比模型2更优&lt; 0时模型2比模型1更优论文地址:https://citeseerx.

Python:列表中,增加元素、删除元素、切片、其它_ab1213456的博客-程序员宅基地

一、向列表中增加元素list.append(单个元素):在list列表末端增加一个元素;list.extend([元素1,元素2]):在list列表末端增加多个元素;list.insert(元素序号,元素):在list列表任意位置增加一个元素二、从列表中删除元素list.remove(元素):从列表中删除一个元素,且并不要求此元素的位置;del....

java map添加_Java8 Map中新增的方法使用总结_通天晓鹿的博客-程序员宅基地

前言得益于 Java 8 的 default 方法特性,Java 8 对 Map 增加了不少实用的默认方法,像 getOrDefault, forEach, replace, replaceAll, putIfAbsent, remove(key, value), computeIfPresent, computeIfAbsent, compute 和merge 方法。另外与 Map 相关的 Ma...

Oracle分区表shrink,Oracle空间回收shrink表_梁贤毅的博客-程序员宅基地

分区表收缩进行shrink space时 发生ORA-10631错误.shrinkspace有一些限制.在表上建有函数索引(包括全文索引)会失败。exec dbms_stats.gather_table_stats(user,'PTABLE',estimate_percent=&gt;100);analyze table PTABLE compute statistics;分区表的查询 BLOCK...

无参考模糊图片质量评价NR-IQA_yang_daxia的博客-程序员宅基地_rankiqa

1.模糊分类北航分为:离焦模糊、高斯模糊、雾天模糊和运动模糊并且提供了相关数据集http://doip.buaa.edu.cn/info/1092/1073.htm其他分类:https://blog.csdn.net/lqhbupt/article/details/391790352.论文:Encoding Visual Sensitivity by MaxPol Convolution Filters for Image Sharpness Assessmenthttp..

随便推点

转载——Linux ANSYS Fluent计算集群配置实录_lunaticman-程序员宅基地_fluent linux

Linux ANSYS Fluent计算集群配置实录作者: 牛钰森前言因为实验室的计算量逐年上升,以前计算的很多是二维轴对称的模型,现在很多都需要建立三维模型,并且网格数量是越来越多,所以最近实验室安装了一套计算集群,主要是用来做流体计算的。因为之前的Linux基础不是很扎实,只会一些基本的命令操作,例如:ls、gcc什么的(后悔当初没有去考一个RHCE),因此从安装到调试

February——703. 数据流中的第 K 大元素&堆的总结以及API的使用_奥古斯都-程序员宅基地

聊今天这个题目之前先聊聊一个数据结构:堆。堆又分为最大堆和最小堆。父节点的值总是大于或者等于任何一个子节点的值时为最大堆。父节点的值总是小于或者等用户任何一个子节点的值时为最小堆。其实说白了就是一个完全二叉树的数据结构。如下图所示,左边是最大堆,右边是最小堆。最大堆和最小堆的应用和优先队列差不多,每次都能弹出一个最大值或者最小值,当然在python中也有相应API。接下来堆API的方法大致说明一下:#导入堆import heapq#将list转化堆heapq.heapify(x)...

使用jquery报错replace is not a function_小猪快跑-程序员宅基地

问题描述:Jquery在使用replace() 的报错:提示“replace is not a function”代码参考如下:var d=15243;var c=d.replace('3','15');上诉异常原因:replace的数据应该为string类型针对“replace is not a function”网上给出了好几个解释:js文件引用顺序,调整js顺序js文件重...

Android使用第三方已经生成的动态SO库 (解决银联崩溃)_无明客的博客-程序员宅基地

在游戏接入第三方RgSDK的时候,游戏支付出了问题,在点击银联标志的时候,游戏崩溃。通过询问RgSDK的技术人员。发现在我根据文档拷贝的所给的SDK的Demo里的文件时少拷贝了一个libentryex.so.他们说这个就是银联的so库。于是 我就把它拷贝过来,拷贝到了libs/armeabi文件夹下,结果在生成apk的时候,这个so库被清除了。于是网上找资料 发现 so库的位置虽然是l

umijs集成braft-editor,出现样式没有加载问题_reg183的专栏-程序员宅基地

今天在umijs写的项目中集成braft-editor,出现下面的问题但是比较了代码发现没有什么问题,怀疑是浏览器的兼容性问题,在最新的chrome中运行也是一样的,分析是样式没有加载,去github的braft-editor的issue中也没有找到解决办法看到官网中的集成代码第一句好像我没写,果断些写上,立刻好使了。import 'braft-editor/dist/index.css'上图,看效果。...

计算机实用知识点总结,小结||计算机知识点小结(必备)_江南小财婆的博客-程序员宅基地

原标题:小结||计算机知识点小结(必备)50. 计算机网络的定义计算机网络是指将一群具有独立功能的计算机通过通信设备及传输媒体被互联起来,在通信软件的支持下,实现计算机间资源共享、信息交换或协同工作的系统。计算机网络是计算机技术和通信技术紧密结合的产物,两者的迅速发展及相互渗透,形成了计算机网络技术51. 计算机网络的发展历程:(1)以数据通讯为主的第一代计算机网络(2)以资源共享为主的第二代计算...

推荐文章

热门文章

相关标签