• C++ 补充 反向迭代器的实现


    阅前提要:

    本文主要是对list和vector的实现的补充,以代码实现为主,注释为辅,如果对vector,list底层实现感兴趣的可以自行阅读,代码量有点大,请大家耐心查看,对理解语言很有帮助(本文的实现方式并不是stl标准库中的实现,但大致的思路一样)

    一、反向迭代器的实现

    实现思想:反向迭代器和正向迭代器的不同点只在于++,--时迭代器的移动方向不同,其他的操作基本一样,我们可以对正向迭代器进行封装,从而得到反向迭代器,代码如下

    1. namespace zxws
    2. {
    3. // 适配器 -- 复用
    4. //这里细节关键在于模板参数可以传任何一个容器的正向迭代器,
    5. //即只要该容器的正向迭代器实现了,那么反向迭代器也就实现了(这就是模板的力量)
    6. template<class Iterator, class Ref, class Ptr>
    7. struct Reverse_iterator
    8. {
    9. Iterator _it;//这是正向迭代器
    10. typedef Reverse_iterator Self;
    11. Reverse_iterator(Iterator it)
    12. :_it(it)
    13. {}
    14. bool operator==(const Self& s)
    15. {
    16. return _it == s._it;
    17. }
    18. bool operator!=(const Self& s)
    19. {
    20. return _it != s._it;
    21. }
    22. //这个函数的实现和我们默认的rbegin()和rend()的位置有关
    23. //下面的代码实现是默认rbegin()是end() rend()是begin()
    24. Ref operator*()
    25. {
    26. Iterator cur = _it;
    27. return *(--cur);
    28. }
    29. Ptr operator->()
    30. {
    31. return &(operator*());
    32. }
    33. Self& operator++()
    34. {
    35. --_it;
    36. return *this;
    37. }
    38. Self& operator--()
    39. {
    40. ++_it;
    41. return *this;
    42. }
    43. Self operator++(int)
    44. {
    45. Self tmp(_it);
    46. --_it;
    47. return tmp;
    48. }
    49. Self operator--(int)
    50. {
    51. Self tmp(_it);
    52. ++_it;
    53. return tmp;
    54. }
    55. };
    56. }

    二、list的实现

    思路:本质和数据结构中的双向循环链表一样,只是用C++的语法实现的,不同点在迭代器

    代码如下

    1. namespace zxws
    2. {
    3. template<class T>
    4. struct Node {
    5. T _val;
    6. Node* _next;
    7. Node* _pre;
    8. Node(const T& x=T())
    9. :_val(x)
    10. ,_next(nullptr)
    11. ,_pre(nullptr)
    12. {}
    13. };
    14. //正向迭代器的实现
    15. template<class T,class Ref,class Ptr>
    16. struct Iterator {
    17. typedef Node Node;
    18. typedef Iterator Self;
    19. Node* node;
    20. Iterator(Node* p)
    21. :node(p)
    22. {}
    23. Self& operator++()
    24. {
    25. node = node->_next;
    26. return *this;
    27. }
    28. Self& operator--()
    29. {
    30. node = node->_pre;
    31. return *this;
    32. }
    33. Self operator++(int)
    34. {
    35. Self tmp(node);
    36. node = node->_next;
    37. return tmp;
    38. }
    39. Self operator--(int)
    40. {
    41. Self tmp(node);
    42. node = node->_pre;
    43. return tmp;
    44. }
    45. Ref operator*()
    46. {
    47. return node->_val;
    48. }
    49. Ptr operator->()
    50. {
    51. return &node->_val;
    52. }
    53. bool operator==(const Self& tmp)
    54. {
    55. return node == tmp.node;
    56. }
    57. bool operator!=(const Self& tmp)
    58. {
    59. return node != tmp.node;
    60. }
    61. };
    62. template<class T>
    63. class list
    64. {
    65. public:
    66. typedef Node Node;
    67. typedef Iterator iterator;
    68. typedef Iteratorconst T&,const T*> const_iterator;
    69. iterator begin()
    70. {
    71. return iterator(_head->_next);
    72. }
    73. const_iterator begin() const
    74. {
    75. return const_iterator(_head->_next);
    76. }
    77. iterator end()
    78. {
    79. return iterator(_head);
    80. }
    81. const_iterator end() const
    82. {
    83. return const_iterator(_head);
    84. }
    85. typedef Reverse_iterator reverse_iterator;
    86. typedef Reverse_iteratorconst T&, const T*> const_reverse_iterator;
    87. //对rbegin(),rend()的位置的定义
    88. //与反向迭代器中解引用运算符的重载实现有关
    89. reverse_iterator rbegin()
    90. {
    91. return reverse_iterator(end());
    92. }
    93. const_reverse_iterator rbegin() const
    94. {
    95. return const_reverse_iterator(end());
    96. }
    97. reverse_iterator rend()
    98. {
    99. return reverse_iterator(begin());
    100. }
    101. const_reverse_iterator rend() const
    102. {
    103. return const_reverse_iterator(begin());
    104. }
    105. list()
    106. {
    107. init();
    108. }
    109. void init()
    110. {
    111. _head = new Node;
    112. _head->_next = _head;
    113. _head->_pre = _head;
    114. }
    115. ~list()
    116. {
    117. clear();
    118. delete _head;
    119. _head = nullptr;
    120. }
    121. void clear()
    122. {
    123. auto cur = begin();
    124. while(cur!=end())
    125. {
    126. cur = erase(cur);
    127. }
    128. }
    129. list(const list& tmp)
    130. {
    131. init();
    132. for(auto& x:tmp)
    133. {
    134. push_back(x);
    135. }
    136. }
    137. list& operator=(list tmp)
    138. {
    139. swap(tmp);
    140. return *this;
    141. }
    142. void swap(list& tmp)
    143. {
    144. std::swap(_head, tmp._head);
    145. }
    146. void push_back(const T& x)
    147. {
    148. insert(x, end());
    149. }
    150. void push_front(const T& x)
    151. {
    152. insert(x, begin());
    153. }
    154. void pop_back()
    155. {
    156. erase(--end());
    157. }
    158. void pop_front()
    159. {
    160. erase(begin());
    161. }
    162. iterator insert(const T& x, iterator pos)
    163. {
    164. Node* cur = pos.node;
    165. Node* pre = cur->_pre;
    166. Node* newnode = new Node(x);
    167. newnode->_next = cur;
    168. cur->_pre = newnode;
    169. newnode->_pre = pre;
    170. pre->_next = newnode;
    171. return newnode;//类型转化
    172. }
    173. iterator erase(iterator pos)
    174. {
    175. assert(pos != end());
    176. Node* cur = pos.node;
    177. Node* next = cur->_next;
    178. cur->_next->_pre = cur->_pre;
    179. cur->_pre->_next = cur->_next;
    180. delete(cur);
    181. return next;//类型转化
    182. }
    183. private:
    184. Node* _head = nullptr;
    185. };
    186. }

    三、vector的实现

    思路:本质和数据结构中的动态数组一样,只是用C++的语法实现的,不同点在迭代器

    1. namespace zxws
    2. {
    3. template <class T>
    4. class vector
    5. {
    6. public:
    7. typedef T* iterator;
    8. typedef const T* const_iterator;
    9. iterator begin()
    10. {
    11. return _start;
    12. }
    13. const_iterator begin() const
    14. {
    15. return _start;
    16. }
    17. iterator end()
    18. {
    19. return _finish;
    20. }
    21. const_iterator end() const
    22. {
    23. return _finish;
    24. }
    25. //++,--,==,!=,*,->没必要写,因为vector迭代器底层是指针,是内置类型,能够自己实现++,--,比较大小等操作
    26. typedef Reverse_iterator reverse_iterator;
    27. typedef Reverse_iteratorconst T&, const T*> const_reverse_iterator;
    28. reverse_iterator rbegin()
    29. {
    30. return reverse_iterator(end());
    31. }
    32. const_reverse_iterator rbegin() const
    33. {
    34. return const_reverse_iterator(end());
    35. }
    36. reverse_iterator rend()
    37. {
    38. return reverse_iterator(begin());
    39. }
    40. const_reverse_iterator rend() const
    41. {
    42. return const_reverse_iterator(begin());
    43. }
    44. vector(){}
    45. vector(const vector& tmp)
    46. {
    47. if (tmp.size())
    48. {
    49. _finish = _start = new T[tmp.capacity()];
    50. for (auto x : tmp)
    51. *(_finish++) = x;
    52. _end_of_storage = _start + tmp.capacity();
    53. }
    54. }
    55. void swap(vector& tmp)
    56. {
    57. std::swap(_start, tmp._start);
    58. std::swap(_finish, tmp._finish);
    59. std::swap(_end_of_storage, tmp._end_of_storage);
    60. }
    61. vector& operator=(vector tmp)
    62. {
    63. swap(tmp);
    64. return *this;
    65. }
    66. ~vector()
    67. {
    68. delete[] _start;
    69. _start = nullptr;
    70. _finish = nullptr;
    71. _end_of_storage = nullptr;
    72. }
    73. T& operator[](size_t pos)
    74. {
    75. assert(pos < size());
    76. return _start[pos];
    77. }
    78. const T& operator[](size_t pos) const
    79. {
    80. assert(pos < size());
    81. return _start[pos];
    82. }
    83. void push_back(const T& x)
    84. {
    85. if (_finish == _end_of_storage)
    86. {
    87. reserve(capacity() == 0 ? 4 : capacity() * 2);
    88. }
    89. *_finish = x;
    90. ++_finish;
    91. }
    92. void pop_back()
    93. {
    94. assert(size() > 0);
    95. --_finish;
    96. }
    97. void resize(size_t n, const T& x = T())
    98. {
    99. if (n>size())
    100. {
    101. reserve(n);
    102. for (int i = size(); i < n; i++)
    103. _start[i] = x;
    104. }
    105. _finish = _start + n;
    106. }
    107. void reserve(size_t n)
    108. {
    109. if (capacity() < n)
    110. {
    111. size_t sz = size();
    112. T* tmp = new T[n];
    113. for (size_t i = 0; i < sz; i++)
    114. tmp[i] = _start[i];
    115. delete[] _start;
    116. _start = tmp;
    117. _finish = _start + sz;
    118. _end_of_storage = _start + n;
    119. }
    120. }
    121. iterator insert(iterator pos,const T& x)
    122. {
    123. assert(pos>=_start&&pos<=_finish);
    124. if (_finish == _end_of_storage)
    125. {
    126. size_t len = pos - _start;
    127. reserve(capacity() == 0 ? 4 : capacity() * 2);
    128. pos = _start + len;
    129. }
    130. iterator it = _finish;
    131. while (it > pos)
    132. {
    133. *it = *(it - 1);
    134. it--;
    135. }
    136. _finish++;
    137. *pos = x;
    138. return pos;
    139. }
    140. iterator erase(iterator pos)
    141. {
    142. assert(pos >= _start && pos < _finish);
    143. iterator cur = pos;
    144. while (cur < _finish - 1)
    145. {
    146. *cur = *(cur + 1);
    147. cur++;
    148. }
    149. --_finish;
    150. return pos;
    151. }
    152. size_t size()
    153. {
    154. return _finish - _start;
    155. }
    156. size_t capacity()
    157. {
    158. return _end_of_storage - _start;
    159. }
    160. private:
    161. T* _start = nullptr;
    162. T* _finish = nullptr;
    163. T* _end_of_storage = nullptr;
    164. };
    165. }

     

  • 相关阅读:
    MFC界面库BCGControlBar v33.2 - Calendar、Planner控件升级
    0087 二叉树
    ssm 基于springboot的车辆故障管理系统Java
    XSS Payload 学习浏览器解码
    聊聊分布式架构10——Zookeeper入门详解
    第六章---C++中的函数
    物联网网关:连接设备与云端的桥梁
    什么是CRM系统?CRM的价值体现在哪里?
    万字长文详解对账系统设计,推荐收藏
    微信小程序、uniapp使用touchstart和touchmove左右滑动删除。以及解决上下抖动问题。
  • 原文地址:https://blog.csdn.net/V_zjs/article/details/133749469