Передача двух параметров в предикат remove_if - PullRequest
0 голосов
/ 08 февраля 2019
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
    */

}

Итак, это часть курса Яндекса по С ++: ссылка на курс

Предикат предопределен, и я не могу его изменить.Это лямбда-функция, принимающая 2 аргумента.Все указывает на то, что я должен использовать этот предикат как часть функции remove_if.

Как передать два аргумента в предикат?

Я пробовал:

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

, но это не работает ...Есть идеи?Спасибо заранее!

1 Ответ

0 голосов
/ 08 февраля 2019

@ someprogrammerdude дайте мне идею (на самом деле это было в моей голове, но я не мог ее «сформировать»:

«Использовать вторую лямбду, принимающую один аргумент, и вызывать первуюlambda? Использовать std :: bind для установки одного из аргументов? "

Итак, я только что использовал одну дополнительную лямбду, чтобы распаковать аргументы, а затем поместил ее в предикат:

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