C++中的erase操作

#include<iostream>#include<string>#include<cctype>usingnamespacestd;intmain(){strings... # include <iostream>
# include <string>
# include <cctype>
using namespace std;

int main()
{
string s("This is A example");
for(string::iterator iter = s.begin(); iter != s.end(); ++iter)
if(isupper(*iter)){
iter = s.erase(iter);
--iter;
}
return 0;
}
它错在哪里?
会提示如下错误:
在Visual Studio 11.0 中运行
上述程序目标是 删除string字符串中的大写字母
展开
 我来答
Hiei1234
2013-07-30 · TA获得超过157个赞
知道小有建树答主
回答量:221
采纳率:0%
帮助的人:126万
展开全部
if(isupper(*iter)){

iter = s.erase(iter);

--iter;

}
问题在这里 iter = s.erase(iter);
注意std::string 实际上里面是个动态 char[]
迭代器内部的内容实际是个char*

那么当erase后 数组长度发生变化

根据动态数组的概念 是不是会发生
char* new_p = new char[new_length];
memcpy(new_p, old_p, new_length);

那么原来的指针还能用吗??

所以你这个功能应该使用 std::remove_if

同样的 vector也不能使用这样的操作

但是类似操作 list就可以。
追问
谢谢,可惜只能采纳一个满意答案,我就按顺序了。你的回答很详细、很专业
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
IT孤鹜
推荐于2018-03-08 · TA获得超过4198个赞
知道大有可为答主
回答量:3960
采纳率:71%
帮助的人:3573万
展开全部
试试这个

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

int main()
{
string s("This is A example");
for(string::iterator iter = s.begin(); iter != s.end();)
if(isupper(*iter))
iter = s.erase(iter);
else
++iter;

cout<<s<<endl;
return 0;

}
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
暖萱紫菱
推荐于2016-05-02 · TA获得超过1.6万个赞
知道小有建树答主
回答量:2129
采纳率:93%
帮助的人:162万
展开全部
erase()函数的功能是用来删除容器中的元素。
函数原型:
iterator erase(iterator where);
iterator erase(iterator first,iterator last);
basic_string& erase(size_type p0=0,size_type n=np);
删除某个容器里的某个元素:c.erase(T);
链表容器以list为例,执行container.erase(it)。
list<int>::iterator it;
for (it = lt.begin(); it != lt.end(); ) {
if (*it % 2 == 0)
lt.erase(it++);
else
++it;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式