如何在c ++中使用std :: remove'd字符串?

SCO*_*SCO 3 c++ string iterator

让我们假设如下:

string s("!Hello!'");
Run Code Online (Sandbox Code Playgroud)

我的目的是在s变量中获取只有"Hello"字符串,IOW我想删除感叹号.

我尝试了以下方法:

std::remove ( s.begin(), s.end(), '!' );
Run Code Online (Sandbox Code Playgroud)

当我得到结果的字符串时,我得到:

Helloo!
Run Code Online (Sandbox Code Playgroud)

"!" 字符已被删除,但字符串的末尾未被移动.

我已经读过我需要从std :: remove的返回值中获取一个迭代器,但我是C++的新手,并没有成功.

我希望像char :: iterator这样的东西是有效的,但似乎不是......所以

char::iterator new_end;
new_end = std::remove ( s.begin(), s.end(), '!' );
cout << new_end ;
Run Code Online (Sandbox Code Playgroud)

没有成功.

任何帮助/指针将不胜感激!

Kon*_*lph 9

std::remove迭代器而不是容器进行操作.因此,它无法调整容器的大小.

你应该使用erase-remove成语:

s.erase(std::remove(s.begin(), s.end(), '!'), s.end());
Run Code Online (Sandbox Code Playgroud)

在这里,remove实现删除逻辑并将迭代器返回到序列中的新的最后一个元素 - 换句话说,它重新排序元素但不触及容器.erase最后,通过将其结束设置为remove返回的大小来调整容器的大小.

  • 我认为你的意思是`std :: remove(s.begin(),..)`而不是`std :: string(s.begin(),...)` (3认同)
  • @KerrekSB:嘿,是的,如果每个人都在抱怨我们都会变得更好;)我想你也有编辑特权? (2认同)
  • 另一种选择是`s.resize(std :: remove(s.begin(),s.end(),'!') - s.begin())`.可以工作,因为字符串迭代器是随机访问的,所以你有`operator -`,因为`resize`永远不会移动元素. (2认同)