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摘要的更多相关文章

  1. c++ stl源码剖析学习笔记(二)iterator

    ITERATOR 迭代器 template<class InputIterator,class T> InputIterator find(InputIterator first,Inpu ...

  2. STL源码剖析 迭代器(iterator)概念与编程技法(三)

    1 STL迭代器原理 1.1  迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型,STL设计的精髓在于,把容器(Containers)和算法(Algorithms)分开,而迭代器(i ...

  3. 面试题总结(三)、《STL源码剖析》相关面试题总结

    声明:本文主要探讨与STL实现相关的面试题,主要参考侯捷的<STL源码剖析>,每一个知识点讨论力求简洁,便于记忆,但讨论深度有限,如要深入研究可点击参考链接,希望对正在找工作的同学有点帮助 ...

  4. 【STL 源码剖析】浅谈 STL 迭代器与 traits 编程技法

    大家好,我是小贺. 点赞再看,养成习惯 文章每周持续更新,可以微信搜索「herongwei」第一时间阅读和催更,本文 GitHub : https://github.com/rongweihe/Mor ...

  5. STL源码剖析读书笔记之vector

    STL源码剖析读书笔记之vector 1.vector概述 vector是一种序列式容器,我的理解是vector就像数组.但是数组有一个很大的问题就是当我们分配 一个一定大小的数组的时候,起初也许我们 ...

  6. 《STL源码剖析》相关面试题总结

    原文链接:http://www.cnblogs.com/raichen/p/5817158.html 一.STL简介 STL提供六大组件,彼此可以组合套用: 容器容器就是各种数据结构,我就不多说,看看 ...

  7. STL源码剖析之序列式容器

    最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...

  8. 《STL源码剖析》学习之traits编程

    侯捷老师在<STL源码剖析>中说到:了解traits编程技术,就像获得“芝麻开门”的口诀一样,从此得以一窥STL源码的奥秘.如此一说,其重要性就不言而喻了.      之前已经介绍过迭代器 ...

  9. 《STL源码剖析》读书笔记

    转载:https://www.cnblogs.com/xiaoyi115/p/3721922.html 直接逼入正题. Standard Template Library简称STL.STL可分为容器( ...

随机推荐

  1. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版新增系统参数管理

    欲了解V3.0版本的相关内容可查看下面的链接地址. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版本发布 在V3.0版本的Web(Mvc.WebForm)与WinF ...

  2. [Android Tips] 25. ADB Command Note

    copy from https://github.com/operando/Android-Command-Note Android Command Note Logcat adb logcat -v ...

  3. TP框架主要文件夹注释

    TP框架主要文件夹注释 common -> 函数库目录 conf -> 配置文件目录lang -> 语言包librang -> 核心资源库 behacior -> 行为目 ...

  4. Ubuntu 16.04 Steam

    Ubuntu 16.04安装Steam,直接去Steam官网下载客户端安装包即可.

  5. Windows Phone 三、样式和资源

    定义样式和引用资源 <Page.Resources> <!-- 向资源字典中添加一个键为ButtonBackground值为SolidColorBrush对象 --> < ...

  6. Select For update语句浅析 (转)

    Select … for update语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句 ...

  7. 关于成为Java高级工程师之路

    简单说明一下现状,个人目前学习使用java已经一年半,很迷茫,高不成低不就,在此列一个目标,为期18个月,再来个一年半,这样软件生涯三年后,我必须成为高级工程师! 这里涉及Java各个方面的知识,有的 ...

  8. 关于linux下关于ssd的使用

    1. 这几个文件系统可以在挂载的时候使用 discard  选项:ext4, xfs, jfs, vfat 2. 使用 fstrim 命令可以实现周期性的 trim,挂载时使用discard标记可以实 ...

  9. [原创]Visual Studio 使用 Just My Code引起无法断点

    今天遇到的问题,同样的代码,在一台机器上用Release配置可以命中断点,在另一台上用Release断点就都失效了.后来发现是因为断点失效的机器上设置了Just My Code.在Debug-Opti ...

  10. Nginx:轻量级高性能的Web服务器

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的R ...