迭代器适配器: 反向迭代器
2023年12月25日 2023年12月25日
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();
示例
-
使用迭代器定位第一个逗号
1string line = "FIRST,MIDDLE,LAST"; 2// ^ <- comma 3 4auto comma = find(line.cbegin(), line.cend(), ','); 5cout << string(line.cbegin(), comma) << endl; 6 7// FIRST
-
使用反向迭代器定位最后一个逗号
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
-
使用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