一、容器概览

  上图为 GI STL 2.9的各种容器。图中以内缩方式来表达基层与衍生层的关系。所谓的衍生,并非继承(inheritance)关系,而是内含(containment)关系。例如 heap 内含一个 vector,priority-queue 内含一个 heap,stack  和 queue 都含一个 deque,set/map/multiset/multimap 都内含一个 RB-tree,hast_x都内含一个 hashtable.

二、序列式容器(sequential containers)

所谓序列式容器,其中的元素都可序(ordered),但᳾排序(sorted)。C++  语 言本身提供了一个序列式容器array,STL另外再提供vector,list,deque, stack,queue,priority-queue等等序列式容器。其中stack和queue由于 只是将deque改头换面而成,技术上被归类为一种适配(adapter)。

list 容器

文件依赖结构图

list概览

list 内实现了其迭代器(G2.9)

注意操作符++重载

  虽然iterator也重载operator*(), 但是这里面的*this并没有使用这个重载;例如self tmp = *this, return *this;这两次*this已经被解释为拷贝构造的参数了 ++*this也没有使用重载的operator*();也是已经把*this解释成了operator++()的参数了

简化修改代码

  1. #include <iostream>
  2. #include <cstdio>
  3. namespace sk
  4. {
  5. template <class T>
  6. struct __list_node {
  7. typedef void* void_pointer;
  8. void_pointer next;
  9. void_pointer prev;
  10. T data;
  11. };
  12.  
  13. template<class T, class Ref, class Ptr>
  14. struct __list_iterator {
  15. typedef __list_iterator<T, T&, T*> iterator;
  16. typedef __list_iterator<T, const T&, const T*> const_iterator;
  17. typedef __list_iterator<T, Ref, Ptr> self;
  18.  
  19. typedef T value_type;
  20. typedef Ptr pointer;
  21. typedef Ref reference;
  22. typedef __list_node<T>* link_type;
  23. typedef size_t size_type;
  24.  
  25. link_type node;
  26.  
  27. __list_iterator(link_type x) : node(x) { printf("__list_iterator(link_type x) \n"); }
  28. __list_iterator() { printf("__list_iterator() \n"); }
  29. __list_iterator(const iterator& x) : node(x.node) {printf("__list_iterator(const link_type x) \n");}
  30.  
  31. bool operator==(const self& x) const { return node == x.node; }
  32. bool operator!=(const self& x) const { return node != x.node; }
  33. reference operator*() const { printf(" operator*() \n");return (*node).data; }
  34.  
  35. #ifndef __SGI_STL_NO_ARROW_OPERATOR
  36. pointer operator->() const { return &(operator*()); }
  37. #endif /* __SGI_STL_NO_ARROW_OPERATOR */
  38.  
  39. self& operator++() {
  40. printf("prev ++ \n");
  41. node = (link_type)((*node).next);
  42. return *this;
  43. }
  44. self operator++(int) {
  45. printf("post ++ \n");
  46. self tmp = *this;
  47. ++*this;
  48. return tmp;
  49. }
  50. self& operator--() {
  51. node = (link_type)((*node).prev);
  52. return *this;
  53. }
  54. self operator--(int) {
  55. self tmp = *this;
  56. --*this;
  57. return tmp;
  58. }
  59.  
  60. void operator=(const self &test)
  61. {
  62. printf("operator=\n");
  63.  
  64. }
  65. };
  66.  
  67. }
  68.  
  69. typedef sk::__list_iterator<int,int&,int*>
  70. list_iterator_int;
  71. list_iterator_int
  72. testassign(list_iterator_int t)
  73. {
  74. return t;
  75. }
  76.  
  77. int main()
  78. {
  79. sk::__list_node<int> node1;
  80. sk::__list_node<int> node2;
  81. sk::__list_node<int> node3;
  82. sk::__list_node<int> node4;
  83. sk::__list_node<int> node5;
  84. node1.next = &node2;
  85. node2.next = &node3;
  86. node3.next = &node4;
  87. node4.next = &node5;
  88.  
  89. node2.prev = &node1;
  90. node3.prev = &node2;
  91. node4.prev = &node3;
  92. node5.prev = &node4;
  93.  
  94. sk::__list_iterator<int,int&,int*> iter1;
  95. iter1.node = &node2;
  96. printf("-------------------iter1++----------------------\n");
  97. iter1++;
  98. printf("-------------------++iter1----------------------\n");
  99. ++iter1;
  100. printf("\n");
  101. printf("-------------------1----------------------\n");
  102. list_iterator_int iter_test;
  103. printf("-------------------2----------------------\n");
  104. iter_test = iter1;
  105. printf("-------------------3----------------------\n");
  106. list_iterator_int iter2 = iter1;
  107. printf("-------------------4----------------------\n");
  108. iter_test = testassign(iter1);
  109. printf("-------------------5----------------------\n");
  110. testassign(iter1);
  111. printf("------------------------------------------\n");
  112.  
  113. return ;
  114. }

test

测试结果

  • 传参的过程中,要调用一次复制构造函数:   iter1入栈时会调用复制构造函数创建一个临时对象,与函数内的局部变量具有相同的作用域.
  • 函数返回值时,也会构造一个临时对象;调用重载赋值操作符赋值给iter_test.

内容参考整理:侯捷STL课程

侯捷STL课程及源码剖析学习3: 深度探索容器list的更多相关文章

  1. 侯捷STL课程及源码剖析学习2: allocator

    以STL 的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作默默付出. 一.分配器测试 测试代码 #include < ...

  2. 侯捷STL课程及源码剖析学习1

    1.C++标准库和STL C++标准库以header files形式呈现: C++标准库的header files不带后缀名(.h),例如#include <vector> 新式C hea ...

  3. c++ stl源码剖析学习笔记(一)uninitialized_copy()函数

    template <class InputIterator, class ForwardIterator>inline ForwardIterator uninitialized_copy ...

  4. python源码剖析学习记录-01

    学习<Python源码剖析-深度探索动态语言核心技术>教程         Python总体架构,运行流程   File Group: 1.Core Modules 内部模块,例如:imp ...

  5. Spring源码剖析2:Spring IOC容器的加载过程

    spring ioc 容器的加载流程 1.目标:熟练使用spring,并分析其源码,了解其中的思想.这篇主要介绍spring ioc 容器的加载 2.前提条件:会使用debug 3.源码分析方法:In ...

  6. Spring源码剖析3:Spring IOC容器的加载过程

    本文转自五月的仓颉 https://www.cnblogs.com/xrq730 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...

  7. c++ stl源码剖析学习笔记(二)iterator

    ITERATOR 迭代器 template<class InputIterator,class T> InputIterator find(InputIterator first,Inpu ...

  8. c++ stl源码剖析学习笔记(三)容器 vector

    stl中容器有很多种 最简单的应该算是vector 一个空间连续的数组 他的构造函数有多个 以其中 template<typename T> vector(size_type n,cons ...

  9. STL源码剖析 学习笔记 MiniSTL

    https://github.com/joeyleeeeeee97 目录: 第二章 空间适配器 第三章 迭代器 第四章 序列式容器(vector,list,deque,stack,heap,prior ...

随机推荐

  1. javascript,移动划过超链接鼠标变手型

    用css控制鼠标样式的语法如下:<span style="cursor:*">文本或其它页面元素</span>把 * 换成如下15个效果的一种: 下面是对这 ...

  2. mybatis 3.2.2_环境搭建

    1.创建一个工程 utf-8 2.导入jar mybatis-3.2.2.jar 核心包 依赖包: asm-3.3.1.jar cglib-2.2.2.jar commons-logging-1.1. ...

  3. 腾讯云Linux VPS新硬盘分区与挂载教程(面板重装不丢失数据)

    以腾讯云Centos系统服务器为例,小记的是数据盘不在本地,大小为20G,以下的教程来自小夕博客的一篇相关添加教程的修改,适合腾讯云Linux Centos系统.说明:参数也许不对,我没有截图了,但所 ...

  4. db连接驱动

    1.oracle 驱动jar包-->ojdbc6.jar 驱动类-->oracle.jdbc.driver.OracleDriver 驱动连接--> 第一种:jdbc:oracle: ...

  5. jquery接触初级-----ajax 之:load()方法

    jquery _ajax 请求主要有几种方式:load(),$.get(),$.post(),$.ajax(),$.getScript(),$.getJson() 1.load()方法 格式:load ...

  6. ACM__并查集

    并查集是树型的数据结构,处理不想交集合 主要解决查找和合并的问题 步骤: 初始化 把每个点所在的集合初始化为自身 复杂度为O(N) 查找 查找元素所在的集合,即根节点 合并 将两个元素所在的集合合并在 ...

  7. 打包制作 ANE

    一.打包ANE 1.ios 准备文件: anePackager.bat aneswc.swc extension.xml flashAne.ane ioslib.a library.swf platf ...

  8. linux 排查page的状态问题

    最近遇到一个page的释放异常的问题,堆栈如下: [ 1000.691858] BUG: Bad page state in process server.o pfn:309d22 [ mapcoun ...

  9. ReactiveX 学习笔记(15)使用 Rx.NET + Json.NET 调用 REST API

    JSON : Placeholder JSON : Placeholder (https://jsonplaceholder.typicode.com/) 是一个用于测试的 REST API 网站. ...

  10. [Shell]Bash基本功能:输入输出重定向

    /*----------------------------------------------------------------------------------------------- @黑 ...