一开始看STL源码是从列表开始的,上一遍博文对于栈的实现是没有迭代器加入的。这里加入了迭代器,所以稍微有点复杂。从list开始只是觉得之前对列表有比其他容器更好的理解。实现的过程中当然也遇到问题,这里和大家分享下我的看法。
在说链表之前,先说下迭代器:迭代器直观点说就是一个指针,因为它重载了所有必须的指针操作符,比如++操作符。为什么要引入迭代器?看了STL里面相关的源码我还是对这个问题有点不理解,但是当我去实现algorithm.h这个头文件的时候,我明白了。因为你在调用algorithm.h里面的函数时,只是传进了几个参数,然后调用里面的方法。但是所有的容器都共用一个algorithm.h文件(除了特殊容器某些特殊原因需要自己定义自己的函数),这样的话站在松耦合、重用性的角度引入了迭代器。
每个容器类里面都定义了自己的迭代器(迭代器都是针对不同的容器有不同的实现),但是迭代器类里面的操作(一般都是指针操作运算的重载)差不多都是一样的。所以你在通过list<int>::iterator定义迭代器时就可以通过操作迭代器来操作整个链表,当然前提是这个迭代器已经获得了链表的结点。
下面通过我写的代码来说明下STL里面的list架构。
//源代码:
//
//
源码的介绍,以及对STL中list的理解:
_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的实现远不止这些,里面有更复杂的操作还没涉及到。只是写点源码了解下STL中list的构架和实现。
分享才是大道理,大家的指正才是我的目的…
个人博客:http://freeloop.info/?p=85