std :: find_if和lambda引用结构字段

肯·恩

这个问题中,我们有:

#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]视为函数参数一样,但是查找结构成员的用例似乎是经常需要的,所以不这样做的原因是什么?支持用法?还是有另一种避免临时变量的方法?

格子呢骆驼

在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; } );
//  ^^^^^^^^^^^^^

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将推断的类型传递给std :: find_if lambda函数

来自分类Dev

将通用Lambda与std :: find_if一起使用

来自分类Dev

使用带有std :: find_if的boost :: lambda或boost :: phoenix

来自分类Dev

C ++-遍历从find_if返回的std :: vector <>

来自分类Dev

std :: find_if,std :: binary_function用于按值搜索std :: map

来自分类Dev

std :: find_if,std :: binary_function用于按值搜索std :: map

来自分类Dev

包装右值引用Lambda时std :: async和std :: bind之间的区别

来自分类Dev

具有重复数据的自定义对象的std :: vector上的std :: find_if

来自分类Dev

std :: begin和std :: end无法使用指针并引用原因?

来自分类Dev

std :: make_unique <std :: thread>与lambda

来自分类Dev

std :: function lambda优化

来自分类Dev

std :: initializer_list和引用类型

来自分类Dev

std :: initializer_list和引用类型

来自分类Dev

std :: stoi,std :: setbase和std :: out_of_range错误

来自分类Dev

std :: search和std :: find_first_of之间的区别

来自分类Dev

std :: count和std :: find之间的性能差异

来自分类Dev

条件std :: future和std :: async

来自分类Dev

std :: minmax()和std :: tie的重载

来自分类Dev

无法删除std :: vector和std :: array?

来自分类Dev

使用std :: bind和std :: function

来自分类Dev

std :: thread和std :: mutex问题

来自分类Dev

std :: async和std :: future行为

来自分类Dev

std :: visit和std :: variant用法

来自分类Dev

无法删除std :: vector和std :: array?

来自分类Dev

std :: bind和std :: weak_ptr

来自分类Dev

使用 std::bind 和 std::visit

来自分类Dev

std :: functions和lambda函数传递

来自分类Dev

STL std :: find()C ++

来自分类Dev

std :: find的C等价