【STL】反向迭代器(Reverse Iterator)

本文介绍了反向迭代器的基本概念及其在C++中的应用。详细解释了如何使用反向迭代器进行容器的反向遍历,并展示了如何通过base()函数将反向迭代器转换为普通迭代器以执行插入和删除操作。

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

1. 定义
反向迭代器(Reverse Iterator)是一种反向遍历容器的迭代器。也就是,从最后一个元素到第一个元素遍历容器。反向迭代器将自增(和自减)的含义反过来了:对于反向迭代器,++运算将访问前一个元素,而–运算则访问下一个元素。
2. 作用
(1)反向迭代器需要使用自减操作符:标准容器上的迭代器(reverse_iterator)既支持自增运算,也支持自减运算。但是,流迭代器由于不能反向遍历流,因此流迭代器不能创建反向迭代器。
(2)可以通过reverse_iterator::base()将反向迭代器转换为普通迭代器使用,从逆序得到普通次序。这是因为:有些容器的成员函数只接受iterator类型的参数,所以如果你想要在ri所指的位置插入一个新元素,你不能直接这么做,因为vector的insert函数不接受reverse_iterator。如果你想要删除ri 所指位置上的元素也会有同样的问题。erase成员函数会拒绝reverse_iterator,坚持要求iterator。为了完成删除和一些形式的插入操作,你必须先通过base函数将reverse_iterator转换成iterator,然后用iterator来完成工作。
3. 例子
  1. void test_reverse()  
  2. {  
  3.     int a[] = {-2, -1, 0, 1, 2, 3, 4};  
  4.     std::list<int> lst(a, a + sizeof(a)/sizeof(int));  
  5.     std::copy(lst.begin(), lst.end(), std::ostream_iterator<int>(std::cout, “ ”));  
  6.     std::cout << std::endl;  
  7.   
  8.     std::list<int>::reverse_iterator rit = lst.rbegin();  
  9.     while(rit != lst.rend())  
  10.         std::cout << *rit++ << ” ”;  
  11.     std::cout << std::endl;  
  12.   
  13.     // 使用base()实现insert或erase等操作。  
  14.     std::vector<int> vect(a, a + sizeof(a)/sizeof(int));  
  15.     // 反向迭代器指向2  
  16.     std::vector<int>::reverse_iterator vrit = std::find(vect.rbegin(), vect.rend(), 2);  
  17.     // 注意:正向迭代器是指向3  
  18.     std::vector<int>::iterator it(vrit.base());  
  19.     inserter(vect, it) = 10;  
  20.     std::copy(vect.begin(), vect.end(), std::ostream_iterator<int>(std::cout, “ ”));  
  21.     std::cout << std::endl;  
  22. }  
void test_reverse()
{
    int a[] = {-2, -1, 0, 1, 2, 3, 4};
    std::list<int> lst(a, a + sizeof(a)/sizeof(int));
    std::copy(lst.begin(), lst.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;

    std::list<int>::reverse_iterator rit = lst.rbegin();
    while(rit != lst.rend())
        std::cout << *rit++ << " ";
    std::cout << std::endl;

    // 使用base()实现insert或erase等操作。
    std::vector<int> vect(a, a + sizeof(a)/sizeof(int));
    // 反向迭代器指向2
    std::vector<int>::reverse_iterator vrit = std::find(vect.rbegin(), vect.rend(), 2);
    // 注意:正向迭代器是指向3
    std::vector<int>::iterator it(vrit.base());
    inserter(vect, it) = 10;
    std::copy(vect.begin(), vect.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
}

输出结果:

  1. -2 -1 0 1 2 3 4  
  2. 4 3 2 1 0 -1 -2  
  3. -2 -1 0 1 2 10 3 4  
  4. 请按任意键继续. . .  
-2 -1 0 1 2 3 4
4 3 2 1 0 -1 -2
-2 -1 0 1 2 10 3 4
请按任意键继续. . .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值