现在的位置: 首页 > 综合 > 正文

【STL】iterator细节

2018年04月23日 ⁄ 综合 ⁄ 共 1638字 ⁄ 字号 评论关闭

一、实现

1、STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一贴胶合剂将它们撮合在一起。

2、迭代器是一种smart pointer

迭代器是一种行为类似指针的对象,而指针的各种行为中最常见也最重要的便是内容提领和成员访问,因此,迭代器最重要

的编程工作就是对 operator* 和 operator-> 进行重载工作。

3、函数的“template参数推导机制”推导的只是参数,无法推导函数的返回值型别。

4、偏特化的意义

所谓偏特化的意思是提供另一份template定义式,而其本身仍为templatized。

针对任何tempalte参数更进一步的条件限制所设计出来的一个特化版本。

5、traits采用了偏特化,扮演“特性萃取机”的角色,萃取各个迭代器的特性,这里所谓的迭代器,指的是迭代器的相应型别。

若要这个特性萃取机traits能够有效运作,每一个迭代器必须遵循约定,自行以内嵌型别定义的方式定义出相应型别。这是

一个约定,谁不遵守这个约定,谁就不能兼容于STL这个大家庭。

6、根据经验,最常用到的迭代器相应型别有5种:

value type 迭代器所指对象之型别

difference type 两个迭代器之间的距离

pointer

reference

iterator category

7、任何一个迭代器,其类型永远应该落在“该迭代器所隶属之各种类型中,最强化的那个”

8、以class来定义迭代器的各种分类标签,不仅可以促成重载机制的成功运作,另一个好处是,通过继承,可以不必再写

“单纯只做传递调用”的函数。

继承关系如下:

struct input_iterator_tag {};
struct output_iterator_tag {};
struct forward_iterator_tag : public input_iterator_tag {};
struct bidirectional_iterator_tag : public forward_iterator_tag {};
struct random_access_iterator_tag : public bidirectional_iterator_tag {};

 

9、STL算法的命名规则:以算法所能接受之最初级类型来为其迭代器型别参数命名。

 

10、traits编程技法大量运用于STL实现品种,它利用“内嵌型别”的编程技巧与编译器的template参数推导功能,增强C++未能提供

的关于型别认证方面的能力,弥补了C++不为强型别语言的遗憾。了解traits编程技法,就象获得“芝麻开门”的口诀一样,从此

得以一窥STL源代码的奥秘。

 

二、迭代器的分类

1、imput iterator

不允许外界改变,只读

2、output iterator

只写

3、forward iterator

允许“写入型”算法在此种迭代器所形成的区间上进行读写操作

4、bidirectional iterator

双向移动,operator--

5、random access iterator

涵盖所有指针算术能力,包括p+n,p-n,p[n],p1-p2,p1<p2

 

6、可用不代表最佳,在研究STL的过程中,每分每秒都要谨记在心,效率是个重要课题。

 

三、SGI STL私房菜

1、__type_traits

iterator_traits负责萃取迭代器的特性,__type_traits则负责萃取型别的特性。

2、__type_traits提供了一种机制,允许针对不同的型别属性,在编译时期完成函数派送决定。

3、即使你无法全面针对你自己定义的型别,设计__type_traits特化版本,无论如何,至少,有了这个__type_traits后,当我们设计

新的泛型算法时,面对C++标量型别,便有足够的信息决定采用最有效的拷贝操作或赋值操作。

 

四、总结

迭代器是一种胶合剂,只有每个容器才知道该设计出怎样的迭代器来遍历自己,至于算法,完全可以独立于容器和迭代器之外自行发展,

只要设计时以迭代器为对外接口就行。

抱歉!评论已关闭.