C++ c++;理解'remove_if()的第三个参数`

C++ c++;理解'remove_if()的第三个参数`,c++,algorithm,stl,remove-if,C++,Algorithm,Stl,Remove If,我试图理解remove\u if()算法中的第三个参数。根据,如果函数返回true,则应删除它。但是,该函数不返回bool。什么是[](char c) remove\u if()是否确实删除了元素?如果是这样的话,为什么要在之后调用erase() std::string S("AA BB-4499--5"); auto newEnd = std::remove_if(S.begin(), S.end(), [](char c){return c == ' ' || c == '-';}); S.

我试图理解
remove\u if()
算法中的第三个参数。根据,如果函数返回true,则应删除它。但是,该函数不返回
bool
。什么是
[](char c)

remove\u if()
是否确实删除了元素?如果是这样的话,为什么要在之后调用
erase()

std::string S("AA BB-4499--5");
auto newEnd = std::remove_if(S.begin(), S.end(), [](char c){return c == ' ' || c == '-';});
S.erase(newEnd, S.end());
[](字符c)是什么语法

这是C++11及更高版本中的lambda语法

在这种情况下,它被用作一个谓词,
remove\u如果
调用来决定要删除哪些元素

remove_if()是否确实删除了元素


不,它只是将“removed”元素移动到字符串的末尾,然后向第一个“removed”元素返回一个迭代器。随后的
erase()
实际上会从字符串中删除元素。这被称为。

有两种版本的删除(无复制)算法。是的

template<class ForwardIterator, class T>
ForwardIterator remove(ForwardIterator first, ForwardIterator last,
const T& value);
它的产量是

0 2 4 6 8 5 6 7 8 9 
0 2 4 6 8 ||| 5 6 7 8 9 
0 2 4 6 8 

“但是函数不返回bool。”事实上,它返回bool。您展示的代码是忘记cplusplus.com的一个示例:它是坏的和过时的。去看cppreference.com。这就是好东西的所在。
#include <iostream>
#include <vector>
#include <algorithm>

int main() 
{
    std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    auto last = std::remove_if( v.begin(), v.end(), []( int x ) { return x % 2; } );

    for ( int x : v ) std::cout << x << ' ';
    std::cout << std::endl;

    for ( auto first = v.begin(); first != last; ++first )
    {
        std::cout << *first << ' ';
    }

    std::cout << "||| ";

    for ( auto first = last; first != v.end(); ++first )
    {
        std::cout << *first << ' ';
    }

    std::cout << std::endl;

    v.erase( last, v.end() );

    for ( int x : v ) std::cout << x << ' ';
    std::cout << std::endl;

    return 0;
}
0 2 4 6 8 5 6 7 8 9 
0 2 4 6 8 ||| 5 6 7 8 9 
0 2 4 6 8