C++擦除未按预期工作
C++ Erase not working as expected
请考虑以下程序:
#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());
相关文章:
- 引用一个已擦除类型(void*)的指针
- 擦除while循环中迭代的元素
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- C++擦除(如果存在)
- 在映射擦除c++期间执行循环的次数
- 为什么擦除方法会影响结束方法
- C++ 字符串类擦除成员函数的时空复杂性
- 类型擦除的std::function与虚拟函数调用的开销
- C++14 中unordered_map矢量和擦除删除成语的奇怪行为
- 在 stl 中的字符串中擦除关键字的工作?
- std::string::擦除没有按我预期工作
- 我如何适应擦除式习惯与矢量元组一起工作
- 向量擦除功能无法正常工作
- C++擦除未按预期工作
- unique_ptr类型擦除析构函数不能正常工作(带有警告)
- C++特定索引处的矢量擦除无法使其正常工作
- 矢量擦除功能不工作(简单的代码)
- 矢量擦除无需设置返回值即可工作
- 在C++中键入擦除:boost::shared_ptr和boost::函数是如何工作的
- 向量::擦除在类方法中不起作用,但在 main 中工作;没有编译器错误,只有意外的结果