读书人

string门类对象erase操作迭代器不失效

发布时间: 2013-09-28 10:01:20 作者: rapoo

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

[解决办法]
如果string采用连续内存来保存内容的话,那么写得到正确的结果也可以理解,但代码是错误的。
不保证任何时候都能得到正确的结果。

读书人网 >C++

热点推荐