先看代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str = "Uranux~";
string::reverse_iterator strRIter = str.rbegin(); // 指向最后一个元素
string::iterator retIter = str.erase(--strRIter.base()); // 接收返回的iterator
strRIter = string::reverse_iterator(retIter); // 修复reverse_iterator
cout << str << endl;
return 0;
}
注意以下几点:
1. 对于reverse_iterator,rbegin()指向最后一个元素;
2. 多种stl容易的erase和insert方法只接收和返回iterator,不接收reverse_iterator,所以需要进行转换,reverse_iterator::base()可以返回一个对应的RandomIterator,可以隐式转换为iterator;
3. reverse_iterator::base()与reverse_iterator本身的指向并不一致,而是有错位(当reverse_iterator指向rbegin(),即最后一个元素位置的时候,reverse_iterator::base()指向的是最后一个元素后面的一个位置),所以我在这里用了“--strRIter.base()”;
4. erase返回的iterator必须保留,因为erase方法会破坏原来的reverse_iterator,我们要利用返回的iterator重新构造之。