C++从string中删除所有的某个特定字符
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
romove
来自<algorithm>
-
作用:在容器中, 在[first, last)之间的所有值等于val的值都会被下一个不等于val的元素覆盖.(除了最后一个元素)
-
返回值:返回一个迭代器 (记作newEnd), 该迭代器指向最后一个未被删除元素的下一个元素, 即相当于容器新的end.
-
不会改变输入vector / string 的长度。其过程,相当于去除指定的字符(以string为例),剩余字符往前靠。后面的和原始字符保持一致。
string r = “aa ddd ffff)”;
string::iterator re = remove(r.begin(), r.end(), ’ ');
cout<<r;aadddffff)fff)
-
所以, 运行完remove后, 容器的[first, newEnd)内的元素即为所有未被删除的元素, [newEnd, end)之间的元素已经没用了.
-
这样, 再运行str.erase(newEnd, str.end())即可清空[newEnd, end)之间的元素.
方法2:常规遍历
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
char ch;
cin >> str;
cin >> ch;
string::iterator it;
for (it = str.begin(); it < str.end(); it++)
{
if (*it == ch)
{
str.erase(it);
it--;
/*
it--很重要,因为使用erase()删除it指向的字符后,后面的字符就移了过来,
it指向的位置就被后一个字符填充了,而for语句最后的it++,又使it向后移
了一个位置,所以就忽略掉了填充过来的这个字符。在这加上it--后就和for
语句的it++抵消了,使迭代器能够访问所有的字符。
*/
}
}
cout << str;
return 0;
}