STL源码剖析(三)迭代器

迭代器的设计思维

STL的中心思想:
把数据容器和算法分开,彼此独立设计,最后以迭代器把他们胶合在一起。

迭代器是一种智能指针

主要讲实现迭代器需要做哪些工作:包括重载operator*和operator->。
要设计容器的迭代器,必须要了解容器的细节,所以迭代器的开发工作是和容器一起的。交由容器设计者设计。

迭代器相应类型(associated type)

难题
假设我们需要在算法中用到迭代器的相应型别(associated type),比如迭代器指向的对象的类型,应该怎么做呢?
C++只支持sizeof(),无法获得对象的类型。
解决方法是:利用函数模板的参数推导机制
这里写图片描述

缺点:函数的模板推导机制无法推导函数的返回值

Traits编程技法

在迭代器实现中声明内嵌类型

这里写图片描述
由于指针并不是类,所以无法为指针声明内嵌类型。我们需要针对原生指针作一些特殊的处理。
这里先介绍一个概念:
模板偏特化(Template partial specialization)
针对任何模板参数更进一步的条件限制所设计出来的一个特化版本。
这里写图片描述

定义一个模板类,专门萃取迭代器的value_type:

这里写图片描述
traits意思是如果I定义其value type,那么通过这个traits的作用,萃取出来的value_type就是I::value_type。
常用的迭代器型别
• Value type:迭代器所指向对象的类型
• Different type:两个迭代器之间的距离
• Pointer
• Reference
• Iterator category:迭代器本身的类型
Iterator category
• Input Iterator:只读
• Output Iterator:只写
• Forward Iterator:允许写入算法在迭代器所指空间读写
• Bidirectional Iterator:双向
• Random Access Iterator:

这里写图片描述

std::iterator的保证

任何迭代器都应该提供五个内嵌型别,以利于与整个STL组件顺利匹配。
STL提供了一个iterators class,如果继承它就可以保证符合STL规范。

猜你喜欢

转载自blog.csdn.net/u014230646/article/details/79620029