【发布时间】:2020-12-24 10:17:30
【问题描述】:
这是我为删除给定字符串中的 空格 而编写的代码。它正常工作。
string a = "hello there world";
int n = a.size();
for(int i =0 ;i<n;++i){
if(a[i] == ' '){
a.erase(a.begin()+i);
}
}
cout<<a;
但是对于上面给定的输入(注意在 "hello" 和 "there" 之间有两个 spaces ),我的输出是:
hello thereworld
“hello”和“world”之间仍然有一个空格。
这种行为正常吗?和erase 有关系吗?
【问题讨论】:
-
删除索引
5处的空格后,索引6处原来的空格向左移动,所以在++i之后保持原样。 -
这是我为删除给定字符串中的空格而编写的代码 -- 你知道你可以简单地完成:
a.erase(std::remove(a.begin(), a.end(), ' '), a.end()); -
不,我没有。谢谢你的一个班轮。那么 remove() 本质上是移除了指定的字符,并返回了一个指向字符串开头的迭代器?
-
std::remove实际上将字符移动到容器的末尾,并将迭代器返回到被删除字符的开始位置。一般来说,如果您正在编写代码来完成您知道已经完成数千次甚至数百万次的事情,那么通常有一个 STL 算法函数或一组函数可以完成这项工作。从序列中删除某些字符只是其中之一。 -
@PaulMcKenzie
std::remove不会将元素移动到容器的末尾。唯一的数据移动是好的元素向左移动,覆盖“删除”的值。新逻辑结束后的元素具有未指定的值。这不是分区算法。