《泛型编程与STL》读书笔记

关键词:
迭代器,函数配接器,迭代器之配接器(Iterator Adapters)
iterator_traits
迭代器的associated type是value_type,difference_type,reference_type,pointer_type,size_type,iterator_category
iterator_tag是iterator_category所属(typedef 5个类之一为iterator_category类型)的5个空类(struct),用来具体区别一个算法的多个实现版本的选择

iterator_traits
what iterator_traits:是个模板类,用于编译时类型推测。可以让算法根据iterator具体实现的不同(例如原生指针,或iterator class,指向const对象的原生指针)提取相应的associated type(value_type,difference_type等(按用途分:临时值类型,返回值类型))
template
struct iterator_traits
{
  typedef typename I:value_type value_type;
  typedef typename  I:difference_type value_type;
};

why iterator_traits:声明count的返回值的difference_type;迭代器的value type
通过 iterator_traits实现根据不同的迭代器实现(如iterator class,或原生指针,指向const对象的原生指针(如const int *)),来提取迭代器的value type(即*iter类型),difference_type等。

why and when iterator_traits p63:
当定义自己的iterator class算法时,会用到iterator_traits
1)你必须返回某值,或是声明临时变量,而其类型与iterator的value type或difference type或reference type或pointer type一致
2)你的算法类似advance,必须根据iterator的分类而决定不同的实现方法。如果没有iterator_traits机制,有时候你只好被迫在“一般化,却没有效率”与“有效率,但过度狭隘”两者之间做一个难以取舍的决定。

how iterator_traits :多了一层中间层,可以独立编写特化版
how 客户端程序员:每一个迭代器类,必须以内嵌类型定义的方式定义迭代器的value type
template struct Node_wrap
{
    typedef Node value_type;
   Node *ptr
};



what Concept:p38

迭代器
what迭代器:用来遍历某个序列。通常用来stl容器内全部或部分元素的对象。
                      迭代器是一种智能指针,其具体实现取决于其所遍历的数据结构,因此,每一种容易类型都必须提供自己的迭代器。事实上每一种容器都将其迭代器以嵌套方式定义于内部。因此各种迭代器的接口相同,类型却不同。

why迭代器:
Iterator对于泛型编程之所以重要,原因是它是算法与数据结构之间的接口。Iterator可说是STL最重要的一个创新发明,它使“将算法与相关数据结构之间的关系切割分离”一事变得可能
我们仅仅要求:iterator能够以某种线性顺序遍历某个数据结构,以访问其中的所有元素

Input Iterator Output Iterator Foward Iterator
Input Iterator:向前读取,只读,并只读一次
Output Iterator:向前读取,只写,并同一位置只写一次
Foward Iterator:支持的指针运算与Input Iterators及Output Iterators同级(可以写++p,但不能写--p或p+=5),其他方面限制较为宽松。
                         可修改。可在同一区间内使用一个以上iterator p47
任何容器类都支持Foward Iterator
find,find_if,for_each,find_if,equal,partial_sum,random_sample,set_intersection使用的是Input Iterator
Bidirectional Iterator是Foward Iterator的refinement(强化)
Random Access Iterator是Input Iterator的一个refindment


p69
STL中心特性是“作用于以iterators形成的range之上的泛型算法”。所有iterators率属于五个与指针极为类似的“concepts”家族。iterators自身提供有一种分类方法,可以让使用者知道“何种算法可用于何种数据结构”

p57
why difference_type:ptrdiff_t所表示的范围还不够大
两个iterator相减的结果是iterator::difference_type。如果iterator是指针,指针相减,其类型为ptrdiff_t。之所以iterator相减的结果不是ptrdiff_t,是因为ptrdiff_t所表示的范围还不够大

p52
iterator不单是一个concept,而是一群彼此具有refinement关系的concepts家族


你可能感兴趣的:(读书笔记,c/c++)