zoukankan      html  css  js  c++  java
  • 【C++ Primer 第10章】再探迭代器

    反向迭代器

    • 反向迭代器就是在容器中从尾元素向首元素反向移动的迭代器。对于反向迭代器,递增(以及递减)操作的含义会颠倒过来。

    • 递增一个反向迭代器(++it)会移动到前一个元素;递减一迭代器(--it)会移动到下一个元素。

    • 除了forward_list之外,其他容器都支持反向迭代器。我们可以通过调用rbegin、rcend、crbegin和crend成员函数来获得反向迭代器。这些成员函数返回指向容器尾元素和首元素之前一个位置的迭代器。与普通迭代器一样,反向迭代器也有const和非const版本。

     1 #include<iostream>
     2 #include<vector>
     3 #include<iterator>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     vector<int> vec = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
     9     for (auto r_iter = vec.crbegin(); r_iter != vec.crend(); ++r_iter)
    10         cout << *r_iter << " "; 
    11     cout << endl;
    12     return 0;
    13 }

    输出结果:

    虽然颠倒递增和递减运算符的含义可能令人混淆,但这样做是我们可以用算法透明地向前或向后处理容器。例如,可以通过向sort传递一对反向迭代器来将vector整理为递减序:

    sort(vec.begin(),vec.end()); 
    sort(vec.rbegin(),vec.rend());
     1 #include <iostream>
     2 #include <deque>
     3 #include <algorithm>
     4 #include <iterator>
     5 using namespace std;
     6 
     7 void print(int elem)
     8 {
     9     cout << elem << ' ';
    10 }
    11 
    12 int main()
    13 {
    14     deque<int> coll;
    15     for (int i = 1; i <= 9; ++i)
    16         coll.push_back(i);
    17 
    18     deque<int>::iterator pos1;
    19     pos1 = find(coll.begin(), coll.end(), 2);
    20 
    21     deque<int>::iterator pos2;
    22     pos2 = find(coll.begin(), coll.end(), 7);
    23     for_each(pos1, pos2, print);
    24     cout << endl;
    25 
    26     deque<int>::reverse_iterator rpos1(pos1);
    27     deque<int>::reverse_iterator rpos2(pos2);
    28     for_each(rpos2, rpos1, print);
    29     cout << endl;
    30     return 0;
    31 }

    输出结果:

     【分析】

    代码首先在一个deque中插入1到9,然后查找元素值为2和7的位置,分别赋值给迭代器pos1和pos2,然后输出,由于STL中的操作总是左开右闭的区间,即[2,7),所以输出2 3 4 5 6,7不会输出。

    接下来将迭代器转换成逆向迭代器,再次输出,对于反向迭代器,由于是反向,所以按逻辑来说它是左开右闭的(这里我尝试了rpos2为iterator.end(),rpos1为iterator.begin(),此时输出全部),即(7,2](事实上还是左闭右开,只不过此时的左和iterator顺序一样)。所以输出6 5 4 3 2,下面的图片解释的很清楚。

  • 相关阅读:
    cmd常用命令
    快捷键
    leetcode:Sort List(一个链表的归并排序)
    leetcode:Merge Two Sorted Lists(有序链表的归并)
    leetcode:Search for a Range(数组,二分查找)
    leetcode:Search a 2D Matrix(数组,二分查找)
    实时操作系统与分时操作系统
    第四章函数作业题,函数模板
    第四章函数作业题,函数的重载
    第四章函数作业题,内置函数
  • 原文地址:https://www.cnblogs.com/sunbines/p/9108094.html
Copyright © 2011-2022 走看看