Stl源码剖析 第三章 iterator摘要
1. Stl的设计思想是: 将数据容器和算法分开,彼此独立设计,最后再以一贴胶合剂将它们撮合在一起,这个胶合剂就是迭代器。
2. 从3.2节迭代器的实现可知,如果要设计一个与容器分离实现的迭代器,会暴露太多容器实现的细节,也就是说,要设计出针对某个容器的迭代器,必须对容器的实现细节非常了解,
所以就将容器的实现细节交给容器设计者,专属迭代器的实现成为容器的一部分,所以每个Stl容器都有提供专属的迭代器。
3. 迭代器是一种行为类似指针的对象,而指针的各种行为中最常见也最重要的便是内容提领和成员访问,因此,迭代器最重要的编程工作就是对 operator* 和 operator-> 进行重载。
4. 函数 template参数推导机制只能推导参数,无法推导函数返回值的类型,为了解决这个问题,迭代器类要使用 typedef类型定义关键字,将其模板类型定义为一个固定的名字(value_type),
然后函数返回值写成 typename T::value_type,即可告知编译器函数返回值是一个模板类型。 但这有一个局限,如果函数参数,即这个迭代器不是类类型,而是普通指针,typename T::value_type就没用了。
解决办法,偏特化:对template参数再进行特化,即模板的模板。 具体实现是实现一个通用类,去萃取模板参数的类型。
template <class I>
struct iterator_traits
{
typedef typename I:value_type value_type;
};
如果迭代器类I有实现自己的value_type,即可萃取出来。
对于普通指针,例如 int* 和 const int* 则要实现特化版本,如下:
template <class T>
struct iterator_traits<T*> //T* can trait int*
{
typedef T value_type;
} template <class T>
struct iterator_traits<const T*> //const T* can trait const int*
{
typedef T value_type;
}
所以关键是这个 iterator_traits,既可萃取迭代器类的value_type, 又可以萃取普通指针的类型。
5. 每个迭代器要实现5种 typedef, 这个是根据STL算法实现而做出的结论:
1). iterator_category(迭代器类型,5选1)
2). value_type 所指向对象类型。 typedef T value_type | typedef Iterator<T> value_type
3). difference_type 表示两个迭代器距离的类型,一般是 ptrdiff_t。
4). pointer 所指向元素的指针类型 ==> typedef T* pointer | typedef Iterator<T>* pointer
5). reference 所指向元素的引用类型 ==> typedef T& reference | typedef Iterator<T>& reference
其实迭代器类的typedef定义和普通指针的偏特化的typedef定义是类似的。
对于iterator_category,是用class来定义的,虽然class没有内容,不仅可以促成重载机制的成功运作,另一个好处是,通过继承,可以不必再写“单纯只做传递调用”(if else)的函数。
每个迭代器只需要形似:
typedef random_access_iterator_tag:: iterator_category 即可定义自己的迭代器类型。
算法在根据迭代器重载多个实现特化版本的时候,最后一个参数就是其中一个iterator_category class的类型。
6. stl提供了一个iterator class定义,自己若是实现了一个容器,迭代器只需要继承这个iterator,重新定义Category 和 valye_type即可。
总结:
设计适当的关联类型(以上5种), 是迭代器本身的责任。设计适当的迭代器,则是容器的责任。 因为只有容器设计者才知道该设计出怎样的迭代器来访问自己,并执行迭代器应有的各种行为(++, --, *, ->)。 因此算法可以完全
独立于容器和迭代器自行设计,对外提供迭代器参数接口即可。
traits编程技法大量运用于STL实现品种,它利用“内嵌型别”的编程技巧与编译器的template参数推导功能,增强C++未能提供的关于型别认证方面的能力,弥补了C++不为强型别语言的遗憾。了解traits编程技法,就象获得“芝麻开门”的口诀一样,从此
得以一窥STL源代码的奥秘。
Stl源码剖析 第三章 iterator摘要的更多相关文章
- c++ stl源码剖析学习笔记(二)iterator
ITERATOR 迭代器 template<class InputIterator,class T> InputIterator find(InputIterator first,Inpu ...
- STL源码剖析 迭代器(iterator)概念与编程技法(三)
1 STL迭代器原理 1.1 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型,STL设计的精髓在于,把容器(Containers)和算法(Algorithms)分开,而迭代器(i ...
- 面试题总结(三)、《STL源码剖析》相关面试题总结
声明:本文主要探讨与STL实现相关的面试题,主要参考侯捷的<STL源码剖析>,每一个知识点讨论力求简洁,便于记忆,但讨论深度有限,如要深入研究可点击参考链接,希望对正在找工作的同学有点帮助 ...
- 【STL 源码剖析】浅谈 STL 迭代器与 traits 编程技法
大家好,我是小贺. 点赞再看,养成习惯 文章每周持续更新,可以微信搜索「herongwei」第一时间阅读和催更,本文 GitHub : https://github.com/rongweihe/Mor ...
- STL源码剖析读书笔记之vector
STL源码剖析读书笔记之vector 1.vector概述 vector是一种序列式容器,我的理解是vector就像数组.但是数组有一个很大的问题就是当我们分配 一个一定大小的数组的时候,起初也许我们 ...
- 《STL源码剖析》相关面试题总结
原文链接:http://www.cnblogs.com/raichen/p/5817158.html 一.STL简介 STL提供六大组件,彼此可以组合套用: 容器容器就是各种数据结构,我就不多说,看看 ...
- STL源码剖析之序列式容器
最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...
- 《STL源码剖析》学习之traits编程
侯捷老师在<STL源码剖析>中说到:了解traits编程技术,就像获得“芝麻开门”的口诀一样,从此得以一窥STL源码的奥秘.如此一说,其重要性就不言而喻了. 之前已经介绍过迭代器 ...
- 《STL源码剖析》读书笔记
转载:https://www.cnblogs.com/xiaoyi115/p/3721922.html 直接逼入正题. Standard Template Library简称STL.STL可分为容器( ...
随机推荐
- lua table integer index 特性
table.maxn (table) Returns the largest positive numerical index of the given table, or zero if the t ...
- python中应用*args 与**kwargs
这是Python函数可变参数 args及kwargs------->目的是:当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值. ...
- doPost()和doGet()
GET 请求的一些特点: GET 请求会有 cache GET 请求会保留在浏览历史中 GET 请求可以保存到书签 GET 请求不应用于处理敏感数据 GET 请求有长度限制 GET 请求应该只用于获取 ...
- jQuery 获取当前节点的html包含当前节点的方法
在开发过程中,jQuery.html() 是获取当前节点下的html代码,并不包含当前节点本身的代码,然后我们有时候确需要,找遍jQuery api文档也没有任何方法可以拿到. 看到有的人通过pare ...
- Java开发环境的配置与Hello World
一.Java开发需要做的准备 Java程序的执行过程是首先由Java编译器将以.java为后缀的Java源文件编译成.class字节码文件.然后字节码文件便可以由JVM虚拟机进行加载并执行. 在初学J ...
- WCF 、Web API 、 WCF REST 和 Web Service 的区别
WCF .Web API . WCF REST 和 Web Service 的区别 The .Net framework has a number of technologies that allow ...
- 通过正则表达式实现简单xml文件解析
这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...
- Bash:-:-定义空变量作为输出结合换行符\n和column输出
RET="" declare -a HOST=() declare -a ALL_SVR=() declare -a FREESVR=() ;i<${#_ALL_AGENT_ ...
- prince2 证书有用吗
prince2 证书有用吗 ? 项目管理是一件非常困难的事情,新闻里充斥着虽利润高却未能成功支付的项目案例.这是为什么呢? 最主要的原因是项目工作比日常的商业工作要困难的多.日常的商业工作往往是重复 ...
- python:模态编程框
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...