C++ 中我运行erase()的时候 老是出现这个 看不懂啊
#include<iostream>#include<string>#include<cctype>usingnamespacestd;intmain(){strings...
#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;
} 展开
#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;
} 展开
3个回答
展开全部
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;
}
展开全部
正在遍历还要执行erase擦除操作,会出现内存问题, 特别是数组,容器.链表这些.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用报错信息“string iterator not decrementable"去百度就能找到你想要的。
初看这部分代码,还没有看出错误端倪,感觉不是很正确的么:遍历list并删除目标的元素。后来实在没辄了,上网查了一下资料,才发现是代码在处理Iterator的earse的时候有点问题。当一个Container执行了一次earse操作之后,原来用来遍历的iterator就失效了,其行为是不可预测的,具体情况由实现决定。同时earse操作会返回一个指向container下一个元素的iterator,如果想继续遍历,就得用返回的iterator继续操作。
代码参考 @兔子和小强 ,他写的很好。
初看这部分代码,还没有看出错误端倪,感觉不是很正确的么:遍历list并删除目标的元素。后来实在没辄了,上网查了一下资料,才发现是代码在处理Iterator的earse的时候有点问题。当一个Container执行了一次earse操作之后,原来用来遍历的iterator就失效了,其行为是不可预测的,具体情况由实现决定。同时earse操作会返回一个指向container下一个元素的iterator,如果想继续遍历,就得用返回的iterator继续操作。
代码参考 @兔子和小强 ,他写的很好。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询