C++ STL reverse_iterator反向迭代器适配器(深入了解,一文学会)

 反向迭代器适配器(reverse_iterator),可简称为反向迭代器或逆向迭代器,常用来对容器进行反向遍历,即从容器中存储的最后一个元素开始,一直遍历到第一个元素。

值得一提的是,反向迭代器底层可以选用双向迭代器或者随机访问迭代器作为其基础迭代器。不仅如此,通过对 ++(递增)和 --(递减)运算符进行重载,使得:

  • 当反向迭代器执行 ++ 运算时,底层的基础迭代器实则在执行 -- 操作,意味着反向迭代器在反向遍历容器;
  • 当反向迭代器执行 -- 运算时,底层的基础迭代器实则在执行 ++ 操作,意味着反向迭代器在正向遍历容器。

   本文作者原创,转载请附上文章出处与本文链接。

C++ STL reverse_iterator反向迭代器适配器(深入了解,一文学会)目录

1 reverse_iterator模板类成员函数

2 reverse_iterator模板类创建

3 reverse_iterator模板类示例 


1 reverse_iterator模板类成员函数

重载运算符功能
operator*以引用的形式返回当前迭代器指向的元素。
operator+返回一个反向迭代器,其指向距离当前指向的元素之后 n 个位置的元素。此操作要求基础迭代器为随机访问迭代器。
operator++重载前置 ++ 和后置 ++ 运算符。
operator+=当前反向迭代器前进 n 个位置,此操作要求基础迭代器为随机访问迭代器。
operator-返回一个反向迭代器,其指向距离当前指向的元素之前 n 个位置的元素。此操作要求基础迭代器为随机访问迭代器。
operator--重载前置 -- 和后置 -- 运算符。
operator-=当前反向迭代器后退 n 个位置,此操作要求基础迭代器为随机访问迭代器。
operator->返回一个指针,其指向当前迭代器指向的元素。
operator[n]访问和当前反向迭代器相距 n 个位置处的元素。

2 reverse_iterator模板类创建

 
  1. #include <iterator>

  2. using namespace std;

  3. reverse_iterator<vector<int>::iterator> my_reiter;

  4. //创建并初始化一个 myvector 容器

  5. vector<int> myvector{ 1,2,3,4,5 };

  6. //创建并初始化 my_reiter 迭代器

  7. reverse_iterator<vector<int>::iterator> my_reiter1(myvector.end());

  8. //创建并初始化一个 vector 容器

  9. vector<int> myvector2{ 1,2,3,4,5 };

  10. //调用复制构造函数初始化反向迭代器的 2 种方式

  11. reverse_iterator<vector<int>::iterator> my_reiter2(myvector2.rbegin());

  12. //reverse_iterator<vector<int>::iterator> my_reiter = myvector.rbegin();

  13. cout << *my_reiter2 << endl;// 8

  14. cout << "---------------------------------------------" << endl;

  15. cout << "---------------------------------------------" << endl;

3 reverse_iterator模板类示例 

 
  1. //创建并初始化一个 vector 容器

  2. vector<int> myvector{ 1,2,3,4,5,6,7,8 };

  3. //创建并初始化一个反向迭代器

  4. reverse_iterator<vector<int>::iterator> my_reiter(myvector.rbegin());//指向 8

  5. cout << *my_reiter << endl;// 8

  6. cout << *(my_reiter + 3) << endl;// 5

  7. cout << *(++my_reiter) << endl;// 7

  8. cout << my_reiter[4] << endl;// 3

  9. cout << "---------------------------------------------" << endl;

  10. cout << "---------------------------------------------" << endl;

以下博客部分内容借鉴自:http://c.biancheng.net/stl/。

C++ STL 容器、迭代器、适配器(深入了解,一文学会)    https://blog.csdn.net/qq_37529913/article/details/120052137                                                                                C++ STL deque容器(深入了解,一文学会)                       https://blog.csdn.net/qq_37529913/article/details/118676574
C++ STL vector容器(深入了解,一文学会)                       https://blog.csdn.net/qq_37529913/article/details/118676109
C++ STL list容器(深入了解,一文学会)                             https://blog.csdn.net/qq_37529913/article/details/118676917
C++ STL forward_list容器(深入了解,一文学会)               https://blog.csdn.net/qq_37529913/article/details/118687348
C++ STL array 容器(深入了解,一文学会)                        https://blog.csdn.net/qq_37529913/article/details/118688364
C++ STL pair 类模板(深入了解,一文学会)                       https://blog.csdn.net/qq_37529913/article/details/118714852
C++ STL map容器(深入了解,一文学会)                           https://blog.csdn.net/qq_37529913/article/details/118741670
C++ STL map emplace()和emplace_hint()(深入了解,一文学会)         https://blog.csdn.net/qq_37529913/article/details/118771777
C++ STL multimap容器(深入了解,一文学会)                    https://blog.csdn.net/qq_37529913/article/details/118773021
C++ STL Set容器(深入了解,一文学会)                             https://blog.csdn.net/qq_37529913/article/details/118918940
C++ STL multiset容器(深入了解,一文学会)                      https://blog.csdn.net/qq_37529913/article/details/119624779
C++ STL unordered_map容器(深入了解,一文学会)         https://blog.csdn.net/qq_37529913/article/details/119689199
C++ STL unordered_set容器(深入了解,一文学会)           https://blog.csdn.net/qq_37529913/article/details/119709019
C++ STL unordered_multiset容器(深入了解,一文学会)    https://blog.csdn.net/qq_37529913/article/details/119709079
C++ STL stack容器适配器(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/119723782
C++ STL queue容器适配器(深入了解,一文学会)       https://blog.csdn.net/qq_37529913/article/details/119746246
C++ STL priority_queue容器适配器(深入了解,一文学会)                https://blog.csdn.net/qq_37529913/article/details/119770527
C++ STL reverse_iterator反向迭代器适配器(深入了解,一文学会)   https://blog.csdn.net/qq_37529913/article/details/119814820
C++ STL insert_iterator插入迭代器适配器(深入了解,一文学会)      https://blog.csdn.net/qq_37529913/article/details/119834378
C++ STL stream_iterator流迭代器(深入了解,一文学会)                  https://blog.csdn.net/qq_37529913/article/details/119834429
C++ STL streambuf_iterator流缓冲区迭代器(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/119850048
C++ STL move_iterator移动迭代器(深入了解,一文学会)                      https://blog.csdn.net/qq_37529913/article/details/119859888
C++ STL advance()函数(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/120008250
C++ STL distance()函数(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/120008300
C++ STL iterator迭代器(深入了解,一文学会)         https://blog.csdn.net/qq_37529913/article/details/120008346
C++ STL const_iterator转换为iterator类型迭代器(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/120008324
C++ STL begin()和end()函数(深入了解,一文学会)        https://blog.csdn.net/qq_37529913/article/details/120008459
C++ STL prev()和next()函数(深入了解,一文学会)         https://blog.csdn.net/qq_37529913/article/details/120008481

C++ STL reverse_iterator反向迭代器适配器(深入了解,一文学会)_c++stl逆向-CSDN博客

C++标准模板库(STL)中,`reverse_iterator`是一个非常有用的迭代器,它允许我们从容器的末尾开始遍历。如果你想自定义一个类似的功能,可以创建一个简单的类,模仿`std::reverse_iterator`的行为。下面是一个基本的实现示例: ```cpp template <typename T> class CustomReverseIterator { public: // 初始化,通常需要一个指向容器元素的指针和当前索引 explicit CustomReverseIterator(T* data = nullptr, size_t index = 0) : data_(data), current_index_(index) {} // 返回值类型,模拟std::reverse_iterator<T&> using iterator_category = std::random_access_iterator_tag; using value_type = T; using difference_type = ptrdiff_t; using pointer = T*; using reference = T&; // 前向移动 CustomReverseIterator& operator++() { if (current_index_ > 0) { --current_index_; } return *this; } // 后向移动 CustomReverseIterator& operator--() { if (current_index_ < data_->size()) { ++current_index_; } return *this; } // 获取指向的元素 T& operator*() const { return *(data_ - current_index_); } T* operator->() const { return &operator*(); } // 判断是否到达开头 bool operator==(const CustomReverseIterator& other) const { return data_ == other.data_ && current_index_ == other.current_index_; } bool operator!=(const CustomReverseIterator& other) const { return !(*this == other); } private: T* data_; // 存储数据的指针 size_t current_index_; // 当前索引,从末尾开始计数 }; ``` 这个自定义的`CustomReverseIterator`类假设你有一个包含元素的动态数组或其他支持随机访问的容器。你可以像操作普通迭代器一样使用它,例如: ```cpp int arr[] = {1, 2, 3, 4, 5}; CustomReverseIterator<int> it(arr, arr.size()); while (it != CustomReverseIterator<int>()) { std::cout << *it-- << " "; } // 输出:5 4 3 2 1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值