请教!关于erase函数的问题~!

cocly 2008-07-16 02:23:11
1)对String使用erase函数
cin>>str;
string::iterator strIt = str.begin();
while(strIt != str.end())
{
if(*strIt == 'A')
strIt = str.erase(strIt);
}

目的:想在str字符串里面删除所有A字符,为什么会在while语句里面出现死循环。

如果用下面方式实现就可以:
string::iterator temp;
for(unsigned int is = 0; is < str.size(); is++)
{
temp = find(str.begin(), str.end(), 'A');
if(temp != str.end())
{
str.erase(temp);
}
}

请教一下大家,谢谢~!
...全文
192 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cocly 2008-08-06
  • 打赏
  • 举报
回复
to:8楼
是指向删除后的元素
原程序中逻辑上存在问题,谢谢大家的解答~!
zhulinjia 2008-07-16
  • 打赏
  • 举报
回复

while(strIt != str.end())
{
if(*strIt == 'A')
strIt = str.erase(strIt);
else
strIt++;
}
上面这个对的

cin>>str;
string::iterator strIt = str.begin();
while(strIt != str.end())
{
if(*strIt == 'A')
strIt = str.erase(strIt);
}
楼主这个是错的. 当条件不成立时,就那死循环.因为条件不成立就无法执行 strIt = str.erase(strIt);
所以就不能指向下一个元素.
string::iterator temp;
for(unsigned int is = 0; is < str.size(); is++) // 最多查找str.size()次.
{
temp = find(str.begin(), str.end(), 'A'); //查找字符'A'找到之后返回迭代器,否则返回end
if(temp != str.end()) //条件成立之后删除.否则重新执行for语句继续查找
{
str.erase(temp);
}
}
所以就不会出现死循环.
zhulinjia 2008-07-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bargio_susie 的回复:]
这样试下:


C/C++ codewhile(strIt != str.end())
{
if(*strIt == 'A')
strIt = str.erase(strIt);
else
strIt++;
}
上面这个对的

cin>>str;
string::iterator strIt = str.begin();
while(strIt != str.end())
{
if(*strIt == 'A')
strIt = str.erase(strIt);
}
楼主这个是错的. 当条件不成立时,就那死循环.因为条件不成立就无法执行 strIt = str.erase(strIt);
所以就不能指向下一个元素.
string::iterator temp;
for(unsigned int is = 0; is < str.size(); is++) // 最多查找str.size()次.
{
temp = find(str.begin(), str.end(), 'A'); //查找字符'A'找到之后返回迭代器,否则返回end
if(temp != str.end()) //条件成立之后删除.否则重新执行for语句继续查找
{
str.erase(temp);
}
}
所以就不会出现死循环.
[/Quote]
skineffect 2008-07-16
  • 打赏
  • 举报
回复
~~~~~,9楼正解,当strIt指向'A'时,'A'被删除,strIt指向下个位置,不会卡死。但是当strIt不指向'A'时,没有strIt++的话strIt自然就走不动了,不死循环才怪。
skybate 2008-07-16
  • 打赏
  • 举报
回复
~~~~~~
K行天下 2008-07-16
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
cin>>str;

string::iterator strIt = str.begin();
while(strIt != str.end())
{
if(*strIt == 'A')
{
strIt = str.erase(strIt);
}
else
strIt++;
}
cout<<str<<endl;
}

bargio_susie 2008-07-16
  • 打赏
  • 举报
回复
"调试的时候跟踪地址来看了一下,发现地址变了"
____________________________________________________
不是 指向被删除项后面的元素吗?

cocly 2008-07-16
  • 打赏
  • 举报
回复
谢谢大家,pc_fly 和bargio_susie 是对的,是逻辑上存在问题
to:bargio_susie
调试的时候跟踪地址来看了一下,发现地址变了,所以有上面的疑问。
RocWay007 2008-07-16
  • 打赏
  • 举报
回复
第一个方法逻辑有问题。
如果字符串是"AB",那么删掉‘A’后,strIt指向‘B’,永远也不等于end(),而且因为*strIt!=‘A’,所以也没有任何递增strIt的语句。当然死循环了。
lqandlq 2008-07-16
  • 打赏
  • 举报
回复

string::iterator strIt = str.begin();
while(strIt != str.end())
{
if(*strIt == 'A')
strIt = str.erase(strIt);
++strIt;
}


验证一下..我不知道可对...
bargio_susie 2008-07-16
  • 打赏
  • 举报
回复
"这一句完成后不是返回的所需的迭代器"

你为什么这么说?
cocly 2008-07-16
  • 打赏
  • 举报
回复
在erase函数的描述中提到了删除一确定项后返回一iterator,指向的是被删除项后面的元素
而在strIt = str.erase(strIt)
这一句完成后不是返回的所需的迭代器,这是为什么呢?
bargio_susie 2008-07-16
  • 打赏
  • 举报
回复
这样试下:

while(strIt != str.end())
{
if(*strIt == 'A')
strIt = str.erase(strIt);
else
strIt++;
}
taodm 2008-07-16
  • 打赏
  • 举报
回复
去看《effective stl》关于现在erase方法的item。
这个话题蛮复杂的,必须去看书认真研究。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧