反迭代器转迭代器:
list<int> ::iterator r_aaaPosBase;
list<int> ::reverse_iterator r_aaaPos = aaa.rbegin();
此处为什么要--
同理,如果有list{1,2,3,4,5},反向迭代器的rend()函数,指向的是1左方的空白位置,与end类似。
此时假如aaaPos指向aaa.begin(),也就是1的位置,利用aaaPos初始化反迭代器r_aaaPos,
r_aaaPos指向的值为1左方的空白,也就是反迭代器的最后一个元素。所以--的作用也是为了对齐反迭代器与迭代器
如果aaaPos指向的是list.end(),insert后aaaPos和r_aaaPos都会指向插入的元素的位置
void reverse2Iterator()
{
list<int> ::iterator aaaPos = aaa.begin();
list<int> ::reverse_iterator r_aaaPos;
aaaPos = aaa.insert(aaaPos, 20000);
//此时为{1,2,3,4,5,20000}
r_aaaPos = list<int> ::reverse_iterator(aaaPos);
r_aaaPos--;
PrintList();
cout << "*aaaPos" << *aaaPos << endl;
cout << "*r_aaaPos" << *r_aaaPos << endl;
while (aaaPos == r_aaaPos.base())
{
cout << "*aaaPos" << *aaaPos << endl;
cout << "*r_aaaPos" << *r_aaaPos << endl;
break;
}
}
r_aaaPos.base()相比单纯的r_aaaPos指向的位置,会更偏向尾部方向1个单位、
例如 1,2,3,4,5,r_aaaPos指向rbegin,也就是5的位置,r_aaaPos.base()会指向5后面一位,也就是普通迭代器指向的end()的位置
所有经过--后,即可对齐r_aaaPos.base()和反向迭代器r_aaaPos的位置。
通俗来讲,反向迭代器如果赋值为rbegin(),则他的base函数返回的是正向迭代器的end();中间指向的值相差了1位。
void reverse2Iterator2()
{
list<int> ::iterator r_aaaPosBase;
list<int> ::iterator aaaPos = aaa.begin();
list<int> ::reverse_iterator r_aaaPos = aaa.rbegin();
aaaPos = aaa.insert(aaaPos, 20000);
//此时为{20000,1,2,3,4,5}
PrintList();
r_aaaPosBase = r_aaaPos.base();
r_aaaPosBase--;
cout << "*aaaPos" << *aaaPos << endl;
cout << "*r_aaaPos" << *r_aaaPos << endl;
cout << "*r_aaaPosBase" << *r_aaaPosBase << endl;
while (aaaPos != r_aaaPosBase)//为偶数时永远不会指向同一位置。
{
aaaPos++;
r_aaaPos++;
r_aaaPosBase--;
cout << "*aaaPos" << *aaaPos << endl;
cout << "*r_aaaPos" << *r_aaaPos << endl;
cout << "* r_aaaPosBase" << *r_aaaPosBase << endl;
if (aaaPos == r_aaaPosBase)
{
break;
}
}
}