STL源码剖析之迭代器与traits编程技法

迭代器与traits编程技法内容总结:

STL源码剖析之迭代器与traits编程技法

迭代器与traits编程技法重难点笔记:

iterator模式定义如下:提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式。STL的中心思想在于:将数据容器( containers)和算法(algorithms)分开,彼此独立设计,最后再以一帖胶着剂将它们撮合在一起。其中迭代器就是扮演着粘合剂的作用。

迭代器是一种智能指针,最重要的编程工作就是对operator* 和operator->进行重载(overloading)。

这个所谓的 traits,其意义是,如果工定义有自己的 value type,那么通过这个 traits的作用,萃取出来的 value_type就是T:: value_type.

traits所扮演的“特性萃取机”角色,萃取各个迭代器的特性,这里所谓的迭代器特性,指的是迭代器的相应型别(associated types)当然,若要这个“特性萃取机”traits能够有效运作,每一个迭代器必须遵循约定,自行以内嵌型别定义(nested typedef)的方式定义出相应型别associated types)这是一个约定,谁不遵守这个约定,谁就不能兼容于STL这个大家庭。
最常用到的迭代器相应型别有五种:
value type,
difference type,
Pointer
reference
iterator catagoly.

迭代器相应型别之一: value type
所谓 value type,是指迭代器所指对象的型别。任何一个打算与STL算法有完美搭配的 class,都应该定义自己的 value type内嵌型别。

迭代器相应型别之二: difference type
difference type用来表示两个迭代器之间的距离,因此它也可以用来表示一个容器的最大容量,因为对于连续空间的容器而言,头尾之间的距离就是其最大容量如果一个泛型算法提供计数功能。

迭代器相应型别之三: reference type
当我们对一个 mutable iterators进行提领操作时,获得的不应该是一个右值(rvalue),应该是一个左值(),因为右值不允许赋值操作(assignment),左值才允许:

迭代器相应型别之四: pointer type
pointers和 references在C++中有非常密切的关联。如果“传回一个左值,令它代表p所指之物”是可能的,那么“传回一个左值,令它代表p所指之物的地址”也一定可以。也就是说,我们能够传回一个 pointer,指向代器所指之物。

迭代器相应型别之五: iterator_category
根据移动特性与施行操作,迭代器被分为五类:
●Input tterator:这种迭代器所指的对象,不允许外界改变。只读(read only)
●Output Hterator:唯写(write only)
● Forward Iterator:允许“写入型”算法(例如replace())在此种迭代器所形成的区间上进行读写操作。
● Bidirectional Iterator:可双向移动某些算法需要逆向走访某个迭代器区间(例如逆向拷贝某范围内的元素),可以使用 Bidirectional Iterators
● Random Access Iterator:前四种迭代器都只供应一部分指针算术能力(前三种支持 operator++,第四种再加上 operator–),第五种则涵盖所有指针算术能力,包括p+n,p-n,p[n],p1-p2,p1<p2

STL源码剖析之迭代器与traits编程技法
迭代器的分类与从属关系

设计适当的相应型别(associated types),是迭代器的责任设计适当的迭代器,则是容器的责任。唯容器本身,才知道该设计出怎样的迭代器来遍历自己,并执行迭代器该有的各种行为(前进、后退、取值、取用成员…)

知识来源:《STL源码剖析》

上一篇:Python 异常处理


下一篇:Rust 从 0 到 1- 高级特性 -Traits 进阶