remove(str.begin(),str.end(),'');无法正常工作(我正在使用Visual Studio 2012)

时间:2018-10-11 03:02:32

标签: c++ iterator

您好,我正在使用Visual Studio 2012,并且在使用此代码时

remove(str.begin(), str.end(), ' ')

具有:

str="hel lo world"

我得到的输出是:helloworldld

是的,还有其他ld。当我在hackerrank上尝试时,它没有问题。为什么不同的环境使该语句没有问题,而VS却有问题?

3 个答案:

答案 0 :(得分:0)

请以a look at the docsstd::remove([...])

  

2 效果:消除迭代器i所引用的所有元素,该元素在[first,last)范围内具有以下对应条件:* i == value,pred(* i)! =错误。
  3 返回:结果范围的结尾。
  [...]
  6 [注:[ret,last)范围内的每个元素(其中ret是返回值)都具有有效但未指定的状态,因为算法可以通过从原来在该范围内的元素移走来消除元素。 —注释]

范围的物理大小未更改,但是所有未删除的元素现在都在[first,return)范围内。

答案 1 :(得分:0)

根据文档(http://www.cplusplus.com/reference/algorithm/remove/),“ 该函数无法更改包含元素范围的对象的属性(即,该函数不能更改数组或数组的大小。容器):删除操作是通过将比较等于val的元素替换为下一个不等于的元素,然后通过将迭代器返回到应为认为它是新的过去元素”。

正确的方法可以在这里找到:How to remove certain characters from a string in C++?

请注意myvector.erase(myvector.begin()+ a,myvector.begin()+ b);从myvector(a <= b)中删除索引a,a + 1,a + 2,...,b-1。 另一方面,myvector.remove(myvector.begin(),myvector.end(),'c');返回“正确的” myvector的新的结束迭代器,而不会出现“ c”。因此,您可以像上面链接中的解决方案一样将返回的迭代器分配给迭代器变量,然后通过该迭代器变量的旧启动迭代器将成为新的“正确”向量。

答案 2 :(得分:0)

您无法使用返回值正确调整字符串的大小:

str.resize(remove(str.begin(), str.end(), ' ') - str.begin());