当前位置:   article > 正文

STL学习_stl_list.h_源码分析

stl_list.h

stl_list.h中有几个函数自己觉得比较重要,transfer()  merge()  sort()

  1. #ifndef _SGI_STL_INTERNAL_LIST_H
  2. #define _SGI_STL_INTERNAL_LIST_H
  3. //list迭代器结构
  4. //不同的容器往往要给容器设置符合自己的迭代器,list的迭代器类型是双向迭代器
  5. //list的迭代器必须有能力进行递增,递减,取值,成员存取等操作
  6. template<class T, class Ref, class Ptr>
  7. struct __list_iterator{
  8. typedef __list_iterator<T, T&, T*> iterator;
  9. typedef __list_iterator< T, const T&, const T*> const_iterator;
  10. typedef __list_iterator<T, Ref, Ptr> self;
  11. //这样写的目的是,为了否和规范,自行开发的迭代器因该提供五个内嵌相应型别,
  12. //以利于traits萃取。
  13. typedef bidirectional_iterator_tag iterator_category;
  14. typedef T value_type;
  15. typedef Ref reference;
  16. typedef Ptr pointer;
  17. typedef size_t size_type;
  18. typedef ptrdiff_t difference_type;
  19. typedef __list_node<T>* link_type;
  20. //迭代器内部指针node指向list的节点
  21. link_type node;
  22. //list迭代器的构造函数
  23. __list_iterator(){}
  24. __list_iterator(link_type x):node(x){}
  25. __list_iterator(const iterator& x):node(x.node){}
  26. bool operator==(const self& x)const
  27. {
  28. return node == x.node;
  29. }
  30. bool operator!=(const self& x)const
  31. {
  32. return node != x.node;
  33. }
  34. //对迭代器取值,取的是节点的数据值
  35. reference operator*() const
  36. {
  37. return (*node).data;
  38. }
  39. //对迭代器的成员存取
  40. pointer operator->()const
  41. {
  42. return &(operator*());
  43. }
  44. //迭代器前进一个节点(对前置++的符号重载)
  45. self& operator++()
  46. {
  47. node = (link_type)((*node).next);
  48. return *this;
  49. }
  50. //(对后置++的符号重载)
  51. self& operator++(int)
  52. {
  53. self tmp = *this;
  54. ++*this;
  55. return tmp;
  56. }
  57. //迭代器后退一个节点
  58. self& operator--()
  59. {
  60. node = (link_type)((*node).prev);
  61. return *this;
  62. }
  63. self& operator--(int)
  64. {
  65. self tmp = *this;
  66. --*this;
  67. return tmp;
  68. }
  69. };
  70. //list的节点结构
  71. template<class T>
  72. struct __list_node{
  73. typedef void* void_pointer;
  74. void_pointer next;
  75. void_pointer perv;
  76. T data;
  77. };
  78. //list的结构
  79. //list缺省使用alloc第二空间配置器
  80. template<class T, class Alloc=alloc>
  81. class list{
  82. protected:
  83. typedef __list_node<T> list_node;
  84. //定义的list_node_allocator这个专属空间配置器,方便以节点大小为配置单位
  85. typedef simple_alloc<list_node, Alloc> list_node_allocator;
  86. typedef void* void_pointer;
  87. public:
  88. typedef T value_type;
  89. typedef value_type* pointer;
  90. typedef const value_type* const_pointer;
  91. typedef value_type& reference;
  92. typedef const value_type& const_reference;
  93. typedef list_node* link_type;
  94. size_t size_t size_type;
  95. typedef ptrdiff_t difference_type;
  96. public:
  97. typedef __list_iterator<T, T&, T*> iterator;
  98. typedef __list_iterator<T, const T&, const T*> const_iterator;
  99. //逆置迭代器
  100. typedef reverse_iterator<const_iterator> const_reverse_iterator;
  101. typedef reverse_iterator<iterator> reverse_iterator;
  102. public:
  103. //list提供的接口
  104. iterator begin(){return (link_type)((*node).next);}
  105. const_iterator begin()const{return (link_type)((*node).next);}
  106. iterator end(){return node;}
  107. const_iterator end()const {return node;}
  108. //指向反向序列的序列头
  109. reverse_iterator rbegin(){return reverse_iterator(end());}
  110. const_reverse_iterator rbegin()const
  111. {
  112. return const_reverse_iterator(end());
  113. }
  114. //指向反向序列的序列尾
  115. reverse_iterator rend() { return reverse_iterator(begin()); }
  116. const_reverse_iterator rend() const {
  117. return const_reverse_iterator(begin());
  118. }
  119. bool empty()const{return node->next == node;}
  120. size_type size()const{
  121. size_type result = 0;
  122. distance(begin(), end(), result);
  123. return result;
  124. }
  125. size_type max_size()const{
  126. return size_type(-1);
  127. }
  128. reference front(){return *begin();}
  129. const_reference front()const{return *begin();}
  130. reference back(){return *(--end());}
  131. const_reference back(){return *(--end());}
  132. void swap(list<T, Alloc>&x)
  133. {
  134. __STD::swap(node, x.node);
  135. }
  136. void clear();
  137. iterator erase(iterator position);
  138. iterator erase(iterator first, iterator last);
  139. //
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/128136
推荐阅读
相关标签
  

闽ICP备14008679号