【问题标题】:c++ find_if lambdac++ find_if lambda
【发布时间】:2012-11-15 08:45:26
【问题描述】:

下面的代码有什么问题?如果结构的第一个成员等于 0,它应该在结构列表中找到一个元素。编译器抱怨 lambda 参数不是谓词类型。

#include <iostream>
#include <stdint.h>
#include <fstream>
#include <list>
#include <algorithm>

struct S
{
    int S1;
    int S2;
};

using namespace std;

int main()
{
    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);

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

【问题讨论】:

  • 我刚刚用 g++ 4.6.3 编译了你的代码,一切都正确编译了。这里没有错误信息。您使用的是哪个编译器?也许它还不了解 lambdas。
  • 你用的是什么编译器?
  • 啊哈。现在我觉得自己很愚蠢。编译器发出警告:lambda 表达式仅适用于 -std=c++0x 或 -std=gnu++0x [默认启用] 我认为这意味着它将默认启用。原来不是。傻我。尽管如此,还是感谢您的帮助。
  • 不,这意味着默认情况下会启用实际警告(而不是由诸如-Wall之类的某些编译器标志触发)。
  • 老实说,我没有发现这个问题过于本地化。事实上,我什至没有看这个问题。简单看一下答案就足以记住实现

标签: c++ lambda


【解决方案1】:

代码在 VS2012 上运行良好,只有一个建议,通过引用传递对象而不是通过值传递:

list<S>::iterator it = find_if(l.begin(), l.end(), [] (const S& s) { return s.S1 == 0; } );

【讨论】:

  • [&]
  • 只是想补充一点,这也适用于 GCC/G++ 4.7。
猜你喜欢
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 2021-03-15
  • 2016-10-01
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
相关资源
最近更新 更多