【问题标题】:std::find_if and lambda referencing structure fieldstd::find_if 和 lambda 引用结构字段
【发布时间】:2016-10-01 19:40:40
【问题描述】:

this question 我们有:

#include <list>
#include <algorithm>

struct S
{
    int S1;
    int S2;
};

int main()
{
    std::list<S> l;
    S s1;
    s1.S1 = 0;
    s1.S2 = 0;
    S s2;
    s2.S1 = 1;
    s2.S2 = 1;
    l.push_back(s2);
    l.push_back(s1);

    auto it = std::find_if(l.begin(), l.end(), [] (S s)
        { return s.S1 == 0; } );
}

但是,如果我想找到s1.S1 的匹配项,我可能会尝试:

auto it = std::find_if(l.begin(), l.end(), [s1.S1] (S s)
    { return s.S1 == s1.S1; } );

但是,我得到一个编译器错误。这有效:

auto foo = s1.S1;
auto it = std::find_if(l.begin(), l.end(), [foo] (S s)
    { return s.S1 == foo; } );

我想我理解为什么我需要引入一个临时简单类型,因为我们可以将[foo] 视为一个函数参数,但是查找结构成员的用例似乎是一个频繁的需求,所以不支持使用的理由是什么?还是有其他方法可以避免临时变量?

【问题讨论】:

  • 为什么不只是std::list&lt;S&gt;::iterator it = std::find_if(l.begin(), l.end(), [s1] (S s) { return s.S1 == s1.S1; } );?顺便说一句,如果您的 lambda 不能超过范围结束,为什么不使用引用捕获?

标签: c++11 lambda stl


【解决方案1】:

在 C++11 中,我认为您无法添加中间变量。在 C++14 中,您可以使用带有初始化程序的捕获:

std::list<S>::iterator it = std::find_if(l.begin(), l.end(), 
    [foo = s1.S1] (S s) { return s.S1 == foo; } );
//  ^^^^^^^^^^^^^

【讨论】:

    猜你喜欢
    • 2021-03-15
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多