【问题标题】:Passing two parameters into remove_if predicate将两个参数传递给 remove_if 谓词
【发布时间】:2019-02-08 13:11:18
【问题描述】:
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)));

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

【问题讨论】:

  • 使用第二个带有单个参数的 lambda,并调用第一个 lambda?使用std::bind 设置参数之一?
  • 你的向量持有一个std::pair&lt;int, string&gt;,所以这就是谓词应该采用的。 auto predicate = [](const std::pair&lt;int, string&gt;&amp; v) { return v.first != 2 &amp;&amp; v.second != "b"; };
  • 为什么要摆弄元组,对就足够了?
  • @Someprogrammerdude 你真棒
  • @Deduplicator,是的,你是对的

标签: c++ algorithm tuples predicate yandex


【解决方案1】:

@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);
});

【讨论】:

  • 很好!当然_int_str不用的时候不用填写。
  • 您可能希望您的谓词接受const&amp; 类型以防止元素复制。在谓词和代理 lambdas const pair&lt;int, string&gt;&amp; p[](const int&amp; _int, const string&amp; _str)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
  • 2017-03-19
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多