C++中逆向迭代器
C++的设计者在设计逆向迭代器时运用了一个小技巧:他们实际上倒置了“半开原则”。逆向迭代器所定义的区间,实际上并不包括起点,反倒是包括了终点。而逻辑上的行为却一如常态,原因是:逻辑上所指的元素为迭代器所指位置的下一个位置
,如下图:
逆向迭代器做逆序处理
/*
* reviter4.cpp
*
* Created on: 2021年1月9日
* Author: san
*/
/*
* 使用逆向迭代器,将两个迭代器所指区间作逆序输出
* 使用base() 将逆向迭代器转回正常迭代器
* 实际位置不变但逻辑位置发生了变化
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> coll;
// insert elements from 1 - 9
for (int i = 1; i<10; ++i)
{
coll.push_back(i);
}
// find pos of element with value 2
vector<int>::iterator pos1;
pos1 = find(coll.begin(), coll.end(),
2);
// find pos2 of element with value 7
vector<int>::iterator pos2;
pos2 = find(coll.begin(), coll.end(),
7);
// print pos1 - pos2
for_each(pos1, pos2,
[](int v){ cout << v << " "; });
cout << endl;
// convert iterator to reverse rpos
vector<int>::reverse_iterator rpos1(pos1);
vector<int>::reverse_iterator rpos2(pos2);
// print pos1 - pos2 in reverse order
for_each(rpos2, rpos1, // range
[](int v) { cout << v << " "; }); // operation
cout << endl;
// convert reverse iterator to normal by base()
vector<int>::iterator rrpos1 = rpos1.base();
vector<int>::iterator rrpos2 = rpos2.base();
// print pos1 - pos2
for_each(rrpos1, rrpos2,
[](int v) { cout << v << " "; });
cout << endl;
return 0;
}