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

摘自侯捷老师的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容器都会提供专属的迭代器

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值