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可分为容器( ...
随机推荐
- js ajax同步请求造成浏览器假死的问题
一.问题的起因 今天做一个需求遇到了这么个情况,就是用户个人中心有个功能,点击按钮,可以刷新用户当前的积分,这个肯定需要使用到ajax的同步请求了,当时喀喀喀三下五除二写玩了,大概代码如下: /** ...
- TIJ——Chapter Eight:Polymorphism
The twist |_Method-call binding Connecting a method call to a method body is called binding. When bi ...
- ANE 从入门到精通 --- 使用R* 访问资源
在AIR4.0版本之前,ANE内无法使用R*,操作资源仅能使用getResourceID(). 对于接SDK来说尤为头疼. 不过4.0以后可以通过在打包时候指定platform.xml来直接使用R*访 ...
- Thread and shared lock
在看programing python 4th,第5张parallel system tool 192页开始,书中讲到thread知识,以下做个笔记,以便后期学习 1.主线程执行,开启5个子线程进行计 ...
- paper 121 :matlab中imresize函数
转自:http://www.cnblogs.com/rong86/p/3558344.html matlab中函数imresize简介: 函数功能:该函数用于对图像做缩放处理. 调用格式: B = i ...
- Immutable笔记
Immutable笔记 转换成js数据 获取或则改变嵌套式imutable数据类型
- js计算相隔天数日期
计算40天前的日期: var temp = new Date();console.log(temp);var tempValue = temp.getTime() - 40 * 24* 60*60*1 ...
- CEGUI0.8.4引入到自己工程中
首先要确定你的CEGUI已经完全编译好,若未进行这一步请参照http://www.cnblogs.com/wenguang1996/p/5027522.html 打开VS2012新建C++工程,然后添 ...
- 初始angular框架(2)
看文档看不懂吧 那就应该看看点例子 看什么例子呢 看看视频教程 一般老师会把一些重要的地方着重讲解的 不懂就反复的看
- MessageClient
using Manager.Common; using System; using System.Collections.Generic; using System.Diagnostics; usin ...