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就可以。
追问
谢谢,可惜只能采纳一个满意答案,我就按顺序了。你的回答很详细、很专业
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
网易云信
2023-12-06 广告
2023-12-06 广告
UIkit是一套轻量级、模块化且易于使用的开源UI组件库,由YOOtheme团队开发。它提供了丰富的界面元素,包括按钮、表单、表格、对话框、滑块、下拉菜单、选项卡等等,适用于各种类型的网站和应用程序。UIkit还支持响应式设计,可以根据不同...
点击进入详情页
本回答由网易云信提供
展开全部
试试这个
# 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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询