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字符串中的大写字母 展开
# 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字符串中的大写字母 展开
3个回答
展开全部
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就可以。
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就可以。
追问
谢谢,可惜只能采纳一个满意答案,我就按顺序了。你的回答很详细、很专业
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
优特美尔电子
2024-11-20 广告
2024-11-20 广告
优特美尔商城是深圳市优特美尔电子有限公司所属的一站式电子元器件采购平台, 依托创始人在电子元器件18年的积累,目前平台汇集了近 3000家品牌供应商、近3000万现货SKU,海内外注册用户超过3万,日均询单2000+。 优特美尔商城基于货源...
点击进入详情页
本回答由优特美尔电子提供
展开全部
试试这个
# 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;
}
# 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;
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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;
}
函数原型:
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询