将两个参数传递给remove_if谓词

时间:2019-02-08 13:11:18

标签: c++ algorithm tuples predicate yandex

void Print (vector<pair<int, string>> v) {
    for(auto& p : v) {
        auto[_int, _str] = Unpack(p);
        cout << p.first << " " << p.second << endl;
    }

}

int main()
{
    vector<pair<int, string>> v = {{1,"b"}, {2, "z"}, {1, "a"}};

    Print(v);
    /* 
    1 b 
    2 z
    1 a 
    */

    auto predicate = [](const int _int, const string _str) {

        return _int != 1 || _str == "b";

    };

    auto it = remove_if(begin(v), end(v), predicate);
    v.erase(it, end(v));

    Print(v);
    /* I want:a
    1 a
    */

}

因此,这是Yandex C ++课程的一部分:coursera link

该谓词是预定义的,我无法更改。这是一个带2个参数的lambda函数。一切都表明我应该将此谓词用作remove_if函数的一部分。

如何将两个参数传递给谓词?

我尝试过:

auto it = remove_if(begin(v), end(v), predicate(auto[_int, _str] = Unpack(p)));

但是它不起作用... 有任何想法吗? 提前感谢!

1 个答案:

答案 0 :(得分:0)

@someprogrammerdude给我一个主意(实际上是在我的脑海中,但是我无法“形成”它:

“使用带有单个参数的第二个lambda,并调用第一个lambda吗?使用std :: bind设置其中一个参数?”

因此,我刚刚使用了一个额外的lambda来解压缩参数,然后将其放入谓词中:

auto it = remove_if(begin(v), end(v), [predicate](pair<int, string> p) {
    return predicate(p.first, p.second);
});