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

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

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

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

//源代码:

//

//_my_list.h #ifndef _MY_LIST #define _MY_LIST //申明结点结构 template<class T> struct _my_node { T _my_data; _my_node * _my_next; _my_node * _my_prev; }; //list类 template<class T_node/*, class T_list*/> class _my_list { public: _my_list(); void _my_push_back(T_node _input_data); void _my_push_front(T_node _input_data); _my_node<T_node> * _my_begin(); _my_node<T_node> * _my_last(); bool _is_end(); void _my_display(); //list的迭代器,方法都在结构内部实现 template<class T_node> struct _my_iterator { _my_node<T_node> * _my_iter_node; _my_iterator(_my_node<T_node> * x) : _my_iter_node(x){}; T_node & operator *() { //返回结点的值 return _my_iter_node->_my_data; } bool operator !=(_my_node<T_node> *x) { return _my_iter_node->_my_data != x->_my_data; } //重载 != 运算符,用来比较两个都是 _my_iterator类型 bool operator != (_my_iterator<T_node> x) { return _my_iter_node->_my_data != x._my_iter_node->_my_data; } bool operator == (_my_node<T_node> *x) { return _my_iter_node->_my_data == x->_my_data; } _my_node<T_node> * operator ++() { _my_iter_node = _my_iter_node->_my_next; return _my_iter_node; } }; private: _my_node<T_node> * _my_head; _my_node<T_node> * _my_tail; }; template<class T_node> _my_list<T_node>::_my_list() { _my_head = NULL; _my_tail = _my_head; } template<class T_node> void _my_list<T_node>::_my_push_back(T_node _input_data) { _my_node<T_node> * _temp_head; _temp_head = _my_head; if(_temp_head) { _my_node<T_node> * _temp_node = new _my_node<T_node>; _temp_node->_my_data = _input_data; _my_tail->_my_next = _temp_node; _my_tail = _temp_node; _my_tail->_my_next = NULL; } else { _my_head = new _my_node<T_node>; _my_head->_my_data = _input_data; _my_tail = _my_head; _my_tail->_my_next = NULL; } } template<class T_node> void _my_list<T_node>::_my_push_front(T_node _input_data) { _my_node<T_node> * _temp_head; //避免对头结点的修改 _temp_head = _my_head; if(_temp_head) { //如果头结点不为空,则直接在头结点上插入 _my_node<T_node> * _temp_node; _temp_node = new _my_node<T_node>; _temp_node->_my_data = _input_data; //在头部实现插入 _temp_node->_my_next = _temp_head; _my_head = _temp_node;//更改_my_head指针值而非_temp_head } else { _my_head = new _my_node<T_node>; _my_head->_my_data = _input_data; _my_tail = _my_head; //出入第一个元素也为最后一个元素 _my_tail->_my_next = NULL; } } template<class T_node> _my_node<T_node> * _my_list<T_node>::_my_begin() { return _my_head; } template<class T_node> _my_node<T_node> * _my_list<T_node>::_my_last() { return _my_tail; } template<class T_node> void _my_list<T_node>::_my_display() { _my_node<T_node> *_temp_head; _temp_head = _my_head; while(_temp_head) { cout<<_temp_head->_my_data<<" "; _temp_head = _temp_head->_my_next; } } #endif

//

源码的介绍,以及对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函数实现:

//源代码:

template <class _my_InputIterator, class T> _my_InputIterator _my_find(_my_InputIterator _my_first, _my_InputIterator _my_last, T & _my_value) { while((_my_first != _my_last) && *_my_first != _my_value) { ++_my_first; } return _my_first; }

/

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

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

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

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

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

  1. php链表和联表的区别,PHP_浅谈PHP链表数据结构(单链表),链表:是一个有序的列表,但 - phpStudy...

    浅谈PHP链表数据结构(单链表) 链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个 ...

  2. 【python】数据结构和算法 + 浅谈单链表与双链表的区别

    有这么一句话说"程序=数据结构+算法",也有人说"如果把编程比作做菜,那么数据结构就好比食材(菜),算法就好比厨艺(做菜的技巧)". 当然这是笼统的说法,不过也 ...

  3. php mysql 链表_浅谈PHP链表数据结构(单链表)

    链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个程序运行时,内存分成五个区(堆区, ...

  4. 浅谈C++ 之STL

    浅谈C++之STL 一.sort sort使用方便,效率较高,底层实现是用快排的方式进行排序 要使用该算法,需要#include 头文件(算法头文件) sort底层实现用的是快速排序 1. sort ...

  5. python生成器和迭代器作用_浅谈Python中的生成器和迭代器

    迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...

  6. python 迭代器协议_浅谈Python中的生成器和迭代器

    迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...

  7. 浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  8. 浅谈算法和数据结构: 五 优先级队列与堆排序

    原文:浅谈算法和数据结构: 五 优先级队列与堆排序 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏 ...

  9. 浅谈尾递归的优化方式

    在上文<尾递归与Continuation>里,我们谈到了尾递归的概念和示例,不过有些朋友对于尾递归的功效依然有所怀疑.因此现在,我再简单讲解一下尾递归的优化原理,希望能给大家以一定理性认识 ...

最新文章

  1. LeetCode实战:三数之和
  2. Martin Davis最新访谈:机器学习是一个收敛的过程,背后理论并不高深
  3. php截取中文字符串时乱码问题
  4. php 文字图片怎么保存为图片,php技术实现加载字体并保存成图片
  5. python知识点汇总百度文库_PYTHON知识点汇总.doc
  6. CodeForces - 1509C The Sports Festival(dp)
  7. 数据挖掘之关联分析五(序列模式)
  8. Flowable 数据库表结构 ACT_RE_DEPLOYMENT
  9. java 泛型的上限与下限、泛型通配符、泛型上下限
  10. 工作流activiti5 使用流程变量
  11. mysql-8.0.14zip怎么使用_mysql 8.0.14 安装配置方法图文教程(通用)
  12. THINKPHP_关联模型MANY_TO_MANY
  13. andriod搭建自己的轮询框架
  14. 《商务与经济统计》(三)
  15. Python编程实现预剪枝的CART决策树
  16. SpringBoot+FreeMarker实现单据打印功能
  17. webservice调用,控制台输出错误:编码GBK的不可映射字符
  18. ps考证是电脑改卷吗
  19. HTTP headers 详解 headers 常用属性
  20. 浙江省软考报名时间成绩查询浙江省教育考试院浙江省人事考试网报名入口

热门文章

  1. 垃圾回收(GC) 很干,很全
  2. 通信网络航天卫星国际会议
  3. LiFS: Low Human-Effort, Device-Free Localization with Fine-Grained Subcarrier Information
  4. Python 字典(Dictionary)day11
  5. 设计一个属于自己的网站
  6. 为什么婚戒要带在无名指上
  7. pta 郑州轻工业大学2020年数据结构练习集
  8. shader冰冻效果
  9. java-从字符串中删除重音符号
  10. 一个针对巴勒斯坦地区进行攻击的APT组织最新活动和相关性分析