STL浅谈(2)——链表+相应迭代器实现

 一开始看STL源码是从列表开始的,上一遍博文对于栈的实现是没有迭代器加入的。这里加入了迭代器,所以稍微有点复杂。从list开始只是觉得之前对列表有比其他容器更好的理解。实现的过程中当然也遇到问题,这里和大家分享下我的看法。

在说链表之前,先说下迭代器:迭代器直观点说就是一个指针,因为它重载了所有必须的指针操作符,比如++操作符。为什么要引入迭代器?看了STL里面相关的源码我还是对这个问题有点不理解,但是当我去实现algorithm.h这个头文件的时候,我明白了。因为你在调用algorithm.h里面的函数时,只是传进了几个参数,然后调用里面的方法。但是所有的容器都共用一个algorithm.h文件(除了特殊容器某些特殊原因需要自己定义自己的函数),这样的话站在松耦合、重用性的角度引入了迭代器。

         每个容器类里面都定义了自己的迭代器(迭代器都是针对不同的容器有不同的实现),但是迭代器类里面的操作(一般都是指针操作运算的重载)差不多都是一样的。所以你在通过list<int>::iterator定义迭代器时就可以通过操作迭代器来操作整个链表,当然前提是这个迭代器已经获得了链表的结点。

         下面通过我写的代码来说明下STL里面的list架构。

//源代码:

//

 

 

//

源码的介绍,以及对STLlist的理解:

 

_my_ node对应STL里面的node

_my_list对应STL里面的list

_my_iterator对应STL里面的iterator

_my_node是最基本的结点,而_my_list定义的结点都是有_my_node组成的。

_my_iterator是定义在_my_list里面的,所以你定义迭代器的时候是通过_my_list<int>::_my_itarator test_iter来定义的(这里将模板类型都定义为int

那你定义了迭代器,迭代器时怎样知道你链表的情况,进而访问链表里面的元素的呢?这里就需要看下里面的构造函数了。_my_iterator里面的构造函数将你获取的_my_list结点信息赋给了初始化的迭代器。

为了和algorithm.h里面的函数相对接,_my_iterator里面重载了一些操作符,看如下自己写的algorithm.h里面的find函数实现:

//源代码:

/

你只要传入两个参数,具体的参数类型你完全不需要担心,因为需要只是你参数的操作,要遍历整个链表你肯定需要重载++操作符。其他的重载函数不再介绍了,比如!=等不再介绍了,实现方式类似。

 

     当然list的实现远不止这些,里面有更复杂的操作还没涉及到。只是写点源码了解下STLlist的构架和实现。

分享才是大道理,大家的指正才是我的目的

个人博客:http://freeloop.info/?p=85

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值