六一的部落格


关关难过关关过,前路漫漫亦灿灿。



reverse iterator

用来逆序遍历容器, 从尾元素向首前元素反向移动

递增一个反向迭代器: 获取指向当前元素前驱的迭代器

递减一个反向迭代器: 获取指向当前元素后继的迭代器

迭代器和反向迭代器都使用了左闭合区间

只考虑用于顺序容器

顺序容器 是否支持
vector(string) O
deque O
list O
forward_list X

获取反向迭代器的操作

常量版本: 迭代器具有底层const
rbegin 获取指向尾元素的迭代器 crbegin
rend 获取指向首前元素的迭代器 crend

示例

不需要写操作: 使用常量版本

1vector<int> vec = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
2
3
4// 每次重新获取指向首前元素的迭代器
5for (auto r_iter = vec.crbegin();
6            r_iter != vec.crend();
7            ++r_iter)
8    cout << *r_iter << endl;

反向迭代器的妙用

将元素逆序排列

1sort(vec.begin(), vec.end());
2// 按从小到大排序
3
4
5sort(vec.rbegin(), vec.rend());
6// 按从大到小排序

base操作

将反向迭代器转换为迭代器

具体实现: 将反向迭代器转换为基类类型迭代器, 再对其执行一次递增操作

1auto it = rit.base();

示例

  1. 使用迭代器定位第一个逗号

    1string line = "FIRST,MIDDLE,LAST";
    2//                  ^ <- comma
    3
    4auto comma = find(line.cbegin(), line.cend(), ',');
    5cout << string(line.cbegin(), comma) << endl;                
    6
    7// FIRST
    
  2. 使用反向迭代器定位最后一个逗号

    1string line = "FIRST,MIDDLE,LAST";
    2//                         ^ <- rcomma
    3
    4auto rcomma = find(line.crbegin(), line.crend(), ',');
    5cout << string(line.crbegin(), rcomma) << endl;
    6
    7// TSAL
    8// 逆序输出LAST
    
  3. 使用base操作输出LAST

    1string line = "FIRST,MIDDLE,LAST";
    2//                         ^ <- rcomma
    3//                          ^ <- rcommabase
    4
    5auto rcomma = find(line.crbegin(), line.crend(), ',');
    6auto rcommabase = rcomma.base();
    7cout << string(rcommabase, line.cend()) << endl;
    8
    9// LAST
    

迭代器适配器: 反向迭代器


reverse iterator

用来逆序遍历容器, 从尾元素向首前元素反向移动

递增一个反向迭代器: 获取指向当前元素前驱的迭代器

递减一个反向迭代器: 获取指向当前元素后继的迭代器

迭代器和反向迭代器都使用了左闭合区间

只考虑用于顺序容器

顺序容器 是否支持
vector(string) O
deque O
list O
forward_list X

获取反向迭代器的操作

常量版本: 迭代器具有底层const
rbegin 获取指向尾元素的迭代器 crbegin
rend 获取指向首前元素的迭代器 crend

示例

不需要写操作: 使用常量版本

1vector<int> vec = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
2
3
4// 每次重新获取指向首前元素的迭代器
5for (auto r_iter = vec.crbegin();
6            r_iter != vec.crend();
7            ++r_iter)
8    cout << *r_iter << endl;

反向迭代器的妙用

将元素逆序排列

1sort(vec.begin(), vec.end());
2// 按从小到大排序
3
4
5sort(vec.rbegin(), vec.rend());
6// 按从大到小排序

base操作

将反向迭代器转换为迭代器

具体实现: 将反向迭代器转换为基类类型迭代器, 再对其执行一次递增操作

1auto it = rit.base();

示例

  1. 使用迭代器定位第一个逗号

    1string line = "FIRST,MIDDLE,LAST";
    2//                  ^ <- comma
    3
    4auto comma = find(line.cbegin(), line.cend(), ',');
    5cout << string(line.cbegin(), comma) << endl;                
    6
    7// FIRST
    
  2. 使用反向迭代器定位最后一个逗号

    1string line = "FIRST,MIDDLE,LAST";
    2//                         ^ <- rcomma
    3
    4auto rcomma = find(line.crbegin(), line.crend(), ',');
    5cout << string(line.crbegin(), rcomma) << endl;
    6
    7// TSAL
    8// 逆序输出LAST
    
  3. 使用base操作输出LAST

    1string line = "FIRST,MIDDLE,LAST";
    2//                         ^ <- rcomma
    3//                          ^ <- rcommabase
    4
    5auto rcomma = find(line.crbegin(), line.crend(), ',');
    6auto rcommabase = rcomma.base();
    7cout << string(rcommabase, line.cend()) << endl;
    8
    9// LAST