阅读STL源码剖析笔记 —— 迭代器概念

来源:互联网 发布:nba2k online mac 编辑:程序博客网 时间:2024/05/16 12:29

摘自侯捷老师的STL源码剖析:一些概念和自己理解的东西:

1.iterator pattern :提供一种方法,使之能够依序寻访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式。


2.STL的中心思想:将数据容器(数据结构) 和 算法 分开,彼此独立设计,最后再以一种粘合剂将它们绑在一起。


3.iterator是一种smart pointer:迭代器是一种行为类似指针的对象,所以迭代器最重要的工作就是重载 operator* (这个返回引用)和 operator -> (这个返回指针)

侯捷老师针对一个简单的链表构造了一个自己的迭代器:

template <Item>struct ListIter{      Item* ptr;   //定义了一个指向节点的指针      ListIter(Item*p = 0) : ptr(p){}   //用指向节点的指针初始化(构造)迭代器      Item& operator*() {return *ptr}   //迭代器的解引用,返回元素的引用      Item* operator->() {return ptr}   //返回指向元素的指针      ListIter& operator++()            //前置++         {ptr = ptr->next;return *this;}      ListIter operator++(int)          //后置++         {ListIter tmp = *this; ++*this; return tmp;}      bool operator==(const ListIter& i)         {return ptr == i.ptr;}      bool operator!=(const ListIter& i)         {return ptr != i.ptr;}};

其中:Item是指装载在自己或者STL定义的List容器里面的元素类型,(自己的理解:迭代器把原始的指向容器里面的元素的指针做了一些包装,让这个指针能在特定的容器里面移动,由于上面定义的迭代器是针对单向链表的,所以没有重载前置--和后置--操作符,重载++操作符, 也是利用了链表节点中的指向下一个节点的指针来完成这项操作),但是上面这个迭代器的实现类过多地暴露了节点,违反了iterator pattern。

我们只有在非常了解List的实现细节之后,我们才能设计出迭代器,正是因为这个原因,每一种STL容器都会提供专属的迭代器

(自己的理解:不同的数据结构有着不同的实现,访问元素的方法也不同,所以每一个容器都有自己的迭代器)

0 0
原创粉丝点击