C++ 中我运行erase()的时候 老是出现这个 看不懂啊

#include<iostream>
#include<string>
#include<cctype>
using namespace std;

int main()
{
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;
}

string的迭代器不能递减。改成:

int main(){
string str="This IS A example";
for(string::iterator iter=str.begin(); iter!=str.end();){
if(isupper(*iter))
iter = str.erase(iter);
else
iter++;
}
cout << str;
}


int main(){
string str="This IS A example";
str.erase(remove_if(str.begin(), str.end(), isupper));
cout << str;
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-04-01
正在遍历还要执行erase擦除操作,会出现内存问题, 特别是数组,容器.链表这些.
第2个回答  2015-04-01
用报错信息“string iterator not decrementable"去百度就能找到你想要的。

初看这部分代码,还没有看出错误端倪,感觉不是很正确的么:遍历list并删除目标的元素。后来实在没辄了,上网查了一下资料,才发现是代码在处理Iterator的earse的时候有点问题。当一个Container执行了一次earse操作之后,原来用来遍历的iterator就失效了,其行为是不可预测的,具体情况由实现决定。同时earse操作会返回一个指向container下一个元素的iterator,如果想继续遍历,就得用返回的iterator继续操作。

代码参考 @兔子和小强 ,他写的很好。

C++ 中我运行erase()的时候 老是出现这个 看不懂啊
int main(){string str="This IS A example";for(string::iterator iter=str.begin(); iter!=str.end();){if(isupper(*iter))iter = str.erase(iter);elseiter++;}cout << str;}或 int main(){string str="This IS A example";str.erase(remove_if(str.begin(), str.end(), isu...

C++erase函数的使用
首先,越界问题。当你指定的范围超出了向量的界限,这将导致运行时错误。确保在调用erase之前,所指的索引位置在有效范围内,即0到向量实际元素数量减一。其次,用法错误。erase函数实际上需要一个迭代器作为参数,而不是直接提供索引。正确的做法是使用begin()函数获取向量的第一个元素的迭代器,然后进行删...

C++高手啊,过来帮帮忙吧,vector里面的函数erase怎么用的?你们看我的...
erase要传一个迭代器而不是下标索引。

linux多线程中(c++)map操作erase的时候产生core!请各位大神帮我...
这种情况一般是线程未同步引起的。STL不是线程安全的,如果你在多个线程中同时操作同一个map,你就必须自己进行同步。

C++中的erase操作
那么当erase后 数组长度发生变化 根据动态数组的概念 是不是会发生 char* new_p = new char[new_length];memcpy(new_p, old_p, new_length);那么原来的指针还能用吗??所以你这个功能应该使用 std::remove_if 同样的 vector也不能使用这样的操作 但是类似操作 list就可以。

C++ STL中erase函数的用法 求助~~
对于vector一般不要用erase(),因为很多情况下他要和<algorithm>中的remove()一块用!erase()的使用会使迭代器失效如果删除的不是最后面的元素的话。你的程序中if(*iter%2==0) ivec.erase(iter); 可以换成:(记着加头文件<algorithm>)if (*iter%2 == 0)ivec.erase(remove(ivec.begin(...

c++stl里面的map.erase(...)
你不会是在循环里用erase吧。这样的原先的迭代器就失效了。你说的delete是什么?同时erase是返回下一个迭代器。因为要用 map stl for(it = stl.begin(); it != stl.end()){ if(),,it = stl.erase(it );else it ++ \/\/ 或者用 st.erase(it++)} ...

我是个C++菜鸟。我想问一下,c++ string类中的erase()函数怎么用的 最好...
(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符 (2)erase(position);删除position处的一个字符(position是个string类型的迭代器)(3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器)下面给你一个例子:\/\/ string::erase include <...

[求助]C++中stl模版中的erase()和end()
在循环中要谨慎使用erase 这个会影响容器本身 有可能会导致出错。如果不得不erase 那么最好使用反向循环从end ->begin

c++ 这个程序 那里错了 怎么老弹出度画框???
删除的话,需要在删除的语句之后把迭代器的值减去删除的元素的个数 for(vector<int>::iterator s=v.begin();s<v.end();s++){ if((*s)%2==0){ v.erase(s);s--;\/\/迭代器的值减去删除的元素的个数 } } for(list<int>::iterator li=l.begin();li!=l.end();li++){ if((*li...

相似回答
大家正在搜