C++擦除未按预期工作

C++ Erase not working as expected

本文关键字:工作 擦除 C++      更新时间:2023-10-16

请考虑以下程序:

#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)之间有一个制表符,其他是空格。

我预计输出是:

这个例子句子等等

相反,我得到以下输出:

这句话废话

额外的""某处是否有缓冲区溢出?

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

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

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

因此,要从容器中实际删除它们,您应该执行以下操作:

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