string类型对象erase操作迭代器不失效?(帖写错了不能改)
上一个帖子写错了把测试代码粘上去了,vector的迭代器问题我知道
iter = cvec.erase(iter)更新迭代器就没问题了
我疑惑的是下面string的erase操作
string str = "this IS A Example";
for(string::iterator iter = str.begin(); iter!= str.end(); ++iter){
if (isupper(*iter)){
str.erase(iter); //问题是这里为什么迭代器没失效
--iter;
}
}
return 0;
[解决办法]
考虑到最坏的情形:
1. 内存会重新分配,此时在删除前保存iter的下一个迭代器也不可行
2. str很大,里面的upper很多,则从后往前删除比较合适
3. 有些编译器的erase根本不返回新的迭代器
得到下面代码,比较ugly...,凑合着看吧:
#include <string>
#include <iterator>
#include <iostream>
int main(int argc, char * argv[])
{
std::string str("this IS A Example");
std::string::reverse_iterator iter = str.rbegin();
while (str.rend() != iter)
{
if (isupper(*iter))
{
std::string::size_type dist = std::distance(iter, str.rend());
str.erase(iter.base() - 1);
iter = str.rend();
std::advance(iter, -(dist));
std::cout << str << std::endl;
}
else
{
++iter;
}
}
std::cout << str << std::endl;
return(0);
}