天天看点

利用reverse_iterator删除string末尾元素

先看代码:

#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;
}
           

输出是"Uranux"。

注意以下几点:

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重新构造之。