[C++]iterator

来源:互联网 发布:羞羞的铁拳网络平台 编辑:程序博客网 时间:2024/05/16 17:42
本文,仅对C++ iterator的知识点进行归纳整理,给出设计的关键步骤。

参考:
  1. 资料一:http://www.cplusplus.com/reference/iterator/(第一参考,简单精要)
  2. 资料二:http://jjhou.boolan.com/programmer-3-traits.pdf(侯捷随笔,非常全面,有时间深刻可看)
  3. 资料三:http://en.cppreference.com/w/cpp/iterator(纯资料)

资料精解:
  1. 资料二
    1. 推演思路:算法的泛化、迭代器的基本形式及其操作、迭代器与容器的关系、迭代器的五种相应类型。
    2. 结论:设计适当的相应类型,是迭代器的责任;设计适当的迭代器,则是容器的责任。唯有容器本身,才知道该设计怎样的迭代器来遍历自己,并配合容器的特性完成某些独特行为。

解决问题:
  1. 五种迭代器的特性(用于查询)
  2. C++的智能指针:auto_ptr(提及它,是为了更好地理解Iterator)
  3. 分析自定义容器所需的迭代器操作
  4. 分析自定义容器所需的迭代器类型(简单分析第一问)
  5. 迭代器的相应类型:associated types(为何STL-Iterator-class有多个typedef类型?)
  6. 继承STL的Iterator模板(简化设计,保证自定义Iterator符合STL的规范,并重用STL各类功能)

问题一:链接,给予表格查看,注意后面的说明,不同类型,表示有不同的操作(操作表达式)。


问题二:具体看 [C++]auto_ptr,auto_ptr也是C++标准程式的一种”samrt pointer”,它初步具备泛化的特性。

问题三:相对第一个来说,比较广泛,亦有函数操作、操作符操作等。
一般而言,对于自定义Iterator,必须要包含几个操作:
  1. inequailty(判断不相等)运算子
  2. dereferencelm(提领、取值、解引用)运算子
  3. prefix increment(前置式递增)运算子
    1. 显然,数组++与链表++是不一样的,这里就可以做一次同一的++操作
  4. copy(复制)行为(以便产生函式的返回值)
  5. begin()和end()函数(迭代标兵)
  6. 构造、赋值操作、拷贝构造、析构(基本类要求)
有了以上的操作,就可以完成很基础的“迭代”操作。

问题四:根据迭代器的移动特性与施行特性,来区分
它们之间往往是以继承is-a关系连结。

选定某类型迭代器,是为了实现方法是最优的、提供最大效率。

问题五:
  1. 迭代器所指之物的类别,成为迭代器的value type
  2. difference type用来表示两个迭代器之间的距离
  3. reference type表示迭代器所指之物是否允许改变。此时作为左值。(引用)
  4. pointer type表示迭代器所指之物的地址(指针)


问题六:
摘抄自:STL-iterator文件
template <class Category, class T, class Distance = ptrdiff_t,
          class Pointer = T*, class Reference = T&>
  struct iterator {
    typedef T         value_type;
    typedef Distance  difference_type;
    typedef Pointer   pointer;
    typedef Reference reference;
    typedef Category  iterator_category;
  };
STL-Iterator-class不含任何成员,纯粹只是类型定义,继承它不会有任何负担。后面三个是有预设值,一般只需提供前两个,即为:容器元素类型+迭代器类型

原创粉丝点击