C ++擦除不按预期工作

时间:2016-06-02 22:54:29

标签: c++

考虑以下计划:

#include <iostream>
#include <string>
#include <algorithm>    // std::remove

int main ()
{
  std::string str ("This is   an   example sentence blah");
  std::remove(str.begin(), str.end(), '\t');
  std::cout << str ;
  return 0;

}

单词(is,an)和(an,example)之间有一个标签,其他是空格。

我希望输出为:

  

这是一个例句blah

相反,我得到以下输出:

  

这是一个例句blahah

是否有额外的缓冲区溢出额外&#39; &#39;?

更多: 几次运行后我注意到,末尾的尾随字母数量与被删除的标签数量成正比。在这种情况下,字符串中有2个选项卡,因此有2个额外的尾随字符。我可以通过使用擦除来处理它,但为什么会发生?我不确定这是设计缺陷还是我错过了什么?

1 个答案:

答案 0 :(得分:2)

是的,您错过了std::remove的事实,正如任何文档中所指出的那样,实际上并没有从容器中删除元素。

当找到要删除的元素时,通过它的元素将移向容器的开头(通过移动赋值operator=(T&&))并返回容器新端的迭代器,但是容器本身不受影响。

所以要从容器中删除它们,你应该这样做:

auto it = std::remove(...);
container.erase(it, container.end());