源码之前,了无秘密。 --侯杰

第三章:迭代器概念与traits编程技法

  迭代器是一种smart pointer

  auto_Ptr 是一个用来包装原生指针(native pointer)的对象,声明狼藉的内存泄漏问题可藉此获得解决。

  auto_ptr用法如下,和原生指针一模一样:

void func() {
auto_ptr<string> ps(new string("jjhou"));
cout << *ps << endl; //输出:jjhou
cout << ps->size() <<endl; //输出:5
//离开前不需delete, auto_ptr会自动释放内存

  函数第一行的意思是,以算式new动态配置一个初值为“jjhou”的string对象,并将所得结果(一个原生指针)

  作为auto_ptr<string>对象的初值
  template partial specialization

  凡原生指针都没有能力定义自己的相应型别

  iterator_traits(特性萃取机) 通过class template partial specialization的作用,不论是原生指针或

  class-type iterators,都可以让外界方便地取其相应型别。

  最常用到的迭代器相应型别有五种:value type, difference type, pointer type, reference type,

  iterator catagoly

template<class I>
struct iterator_traits {
//需要typename标识的目的是告诉编译器这表示一个类型
typedef typename I::iterator_category iterator_category;
typedef typename I::value_type value_type;
typedef typename I::difference_type difference_type;
typedef typename I::pointer pointer;
typedef typename I::reference reference;
};

  根据移动特性与施行操作,迭代器被分为五类:

    Input Iterator:不允许外界改变。只读。

    Output Iterator:唯写(write only)

    Forward Iterator: 允许写入型算法(例如replace())在此种迭代器所形成的区间上进行读写操作。

    Bidirectional Iterator:可双向移动。某些算法需要逆向走访某个迭代器区间

    (例如逆向拷贝某范围内的元素)

    Random Access Iterator: 前四种迭代器都只供应一部分指针算术能力(前三种支持operator++,

    第四种再加上operator--),第五种则涵盖所有

    指针的算术能力,包括p+n,p-n,p1-p2,p1<p2

  这一章的详细内容请看园子里的另外一篇博客: STL源码学习----迭代器及其适配器

04-26 17:32