考虑以下计划:
#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个额外的尾随字符。我可以通过使用擦除来处理它,但为什么会发生?我不确定这是设计缺陷还是我错过了什么?
答案 0 :(得分:2)
是的,您错过了std::remove
的事实,正如任何文档中所指出的那样,实际上并没有从容器中删除元素。
当找到要删除的元素时,通过它的元素将移向容器的开头(通过移动赋值operator=(T&&)
)并返回容器新端的迭代器,但是容器本身不受影响。
所以要从容器中删除它们,你应该这样做:
auto it = std::remove(...);
container.erase(it, container.end());