C ++带有remove_if的异常行为

Par*_*dox 6 c++ string stl-algorithm

我试图用std::remove_if它从一个简单的字符串中删除空格,但结果却很奇怪。有人可以帮我弄清楚发生了什么吗?

该代码是:

#include <iostream>
#include <algorithm>
#include <string>

int main(int argc, char * argv[])
{
    std::string test = "a b";
    std::remove_if(test.begin(), test.end(), isspace);
    std::cout << "test : " << test << std::endl; 

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望这只是打印出来:

test : ab
Run Code Online (Sandbox Code Playgroud)

但是我得到了

test : abb
Run Code Online (Sandbox Code Playgroud)

尝试另一个字符串,我得到:

输入:“ a bcde uv xy”

输出:“ abcdeuvxy xy”

似乎它在复制最后一个“单词”,但有时会添加一个空格。我怎样才能在不做任何奇怪的事情的情况下删除所有空间?

son*_*yao 11

std::remove_if通过移动元素执行删除;实际上,删除的元素不会从容器中删除。STL算法没有这种特权。只有容器可以删除其元素。

(强调我的)

删除是通过移动(通过移动分配)范围内的元素来完成的,要删除的元素出现在范围的开头。保留其余元素的相对顺序,并且容器物理大小未更改。指向范围的新逻辑端和物理端之间的元素的迭代器仍然 是可取消引用的,但是元素本身具有未指定的值(根据MoveAssignable后置条件)。在调用remove之前,通常会先调用容器的擦除方法,该方法会擦除未指定的值并减少容器的物理大小以匹配其新的逻辑大小

可以erase除去元件之后(这被称为擦除remove惯用法)。

test.erase(std::remove_if(test.begin(), test.end(), isspace), test.end());
Run Code Online (Sandbox Code Playgroud)