首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

string门类对象erase操作迭代器不失效?(帖写错了不能改)

2013-09-28 
string类型对象erase操作迭代器不失效?(帖写错了不能改)上一个帖子写错了把测试代码粘上去了,vector的迭代

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采用连续内存来保存内容的话,那么写得到正确的结果也可以理解,但代码是错误的。
不保证任何时候都能得到正确的结果。

热点排行