C++ iterator(5)reverse_iterator adaptor

本文详细解析了C++中的reverse_iterator适配器,包括其定义、用法及如何通过rbegin和rend函数反转容器元素遍历方向。通过实例演示了如何将普通迭代器转换为反向迭代器,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面
  • 迭代器适配器种类有很多,此次主要说明 reverse_iterator 。同时对 迭代器函数 rbegin 和 rend 进行说明。
一 迭代器适配器
  • 迭代器适配器种类,例如:
    • reverse_iterator
    • move_iterator(C++11)
    • insert_iterator
    • front_insert_iterator
    • back_insert_iterator
    • istream_iterator
    • ostream_iterator
二 迭代器适配器相关函数
三 reverse_iterator
  • 头文件< iterator >
  • 定义
template< class Iter >
class reverse_iterator : public std::iterator<
                           typename std::iterator_traits<Iter>::iterator_category,
                           typename std::iterator_traits<Iter>::value_type,
                           typename std::iterator_traits<Iter>::difference_type,
                           typename std::iterator_traits<Iter>::pointer,
                           typename std::iterator_traits<Iter>::reference > (C++17)
template< class Iter >
class reverse_iterator; (C++17)
  • 说明
    • reverse_iterator 反转给定迭代器方向的迭代器适配器。
    • 对于从迭代器 i 构造的 r 逆向迭代器,关系 &r == &(i-1) 始终为 true (只要 r 可解引用)
四 rbegin 和 rend
std::vector<int> vc{1,2,3,4,5,6,7,8,9};
print("it: ", vc.begin(), vc.end());
print("reverse it: ", vc.rbegin(), vc.rend());

auto begin = vc.begin();
auto end = vc.end();
auto rbegin = vc.rbegin();
auto rend = vc.rend();

auto it = std::find(vc.begin(), vc.end(), 5);
std::cout << "*it: " << *it << std::endl;
auto rit = std::reverse_iterator<decltype(it)>(it); // 注释1
std::cout << "*rit: " << *rit << std::endl;
auto rit_base = rit.base();  // 注释2
std::cout << "*rit_base: " << *rit_base << std::endl;
  • 结果:
it: :  1 2 3 4 5 6 7 8 9
reverse it: :  9 8 7 6 5 4 3 2 1
*it: 5
*rit: 4
*rit_base: 5
  • 结果PS:
// ps:变量地址,印证图例
// 《C++标准库》中称为反向迭代器的逻辑位置和物理位置
begin:  0x01168dc0
end:    0x01168de4
rgbegin:0x01168de0 (current ptr: 0x01168de4)
rend:   0x01168dbc (current ptr: 0x01168dc0)

vs调试中rend内存状态

  • 说明:
  1. 使用 std::reverse_iterator 将 iterator 转换为 reverse iterator. (注释1)
  2. base() 将 reverse iterator 转换为 iterator. (注释2)
五 参考
### 使用迭代器实现反向遍历 #### 利用 `std::reverse_iterator` 进行反向遍历 C++ 提供了标准库中的 `std::reverse_iterator` 来简化容器的反向遍历操作。通过组合容器提供的正向迭代器,可以轻松创建反向迭代器来访问元素。 对于任何支持双向迭代器的 STL 容器(如 `vector`, `list`, 或者 `deque`),可以通过调用成员函数 `rbegin()` 和 `rend()` 获取反向迭代器[^2]: ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // 创建反向迭代器并打印元素 for (auto rit = vec.rbegin(); rit != vec.rend(); ++rit) { std::cout << *rit << " "; } } ``` 这段代码展示了如何利用 C++ 标准库中定义的方法来进行简单的反向遍历。 #### 自定义数据结构上的反向遍历 当面对自定义的数据结构时,如果希望提供类似的反向遍历功能,则可以在该类内部实现相应的接口方法,比如 `rbegin()` 和 `rend()`,返回特定类型的反向迭代器对象。 #### 借助 Boost 库扩展反向遍历能力 Boost 库提供了更灵活的方式来处理各种范围的操作,包括但不限于反向遍历。使用 `boost::adaptors::reverse` 可以方便地对任意范围内元素执行逆序操作[^4]: ```cpp #include <iostream> #include <vector> #include <boost/range/adaptor/reversed.hpp> using namespace boost::adaptors; int main(){ std::vector<int> v{0, 1, 2, 3}; // 使用 boost adaptors 对 vector 进行反转遍历 for(int i : v | reversed){ std::cout << i << ' '; } } ``` 此示例说明了即使不直接依赖于容器本身的特性,也可以借助第三方工具包获得强大的反向遍历机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值