2017-03-05 8 views
0

にキャプチャするために失敗し、再現コードは、ここでラムダ

#include <iostream> 
#include <vector> 
#include <algorithm> 

class X 
{ 
public: 
int a; 
    X(int b) 
    : a(b) 
    {} 
}; 

int main() 
{ 
    // Build the vector 'v' 
    std::vector<X> v; 
    X x1(7); 
    v.push_back(x1); 
    X x2(11); 
    v.push_back(x2); 
    X x3(16); 
    v.push_back(x3); 
    X x4(20); 
    v.push_back(x4); 
    X x5(22); 
    v.push_back(x5); 
    X x6(31); 
    v.push_back(x6); 
    X x7(38); 
    v.push_back(x7); 

    // Search if there is an element of 'v' which attribute 'a' equals 18 
    int y(18); 
    if (
    std::find(
     v.begin(), 
     v.end(), 
     [&](const X& o){return o.a == y;} 
    ) == v.end() 
    ) 
    { 
    std::cout << "'y' is not present in 'v'\n"; 
    } else 
    { 
    std::cout << "'y' is present in 'v'\n"; 
    } 

    return 0; 
} 

である私は、私は選択肢の数を試してみましたが、thisとの数を読んだg++ -std=c++14 a.cpp -o aでコンパイルし

error: invalid operands to binary expression 
     ('X' and 'const (lambda at a.cpp:38:5)') 

を取得しようSEの投稿にはError: variable “cannot be implicitly captured because no default capture mode has been specified”が含まれていますが、私は間違いを見ません。

答えて

5

std::find()を使用しており、引数にはstd::find_if()を使用する必要があります。

std::find()を使用する場合、3番目の引数はコンテナの値にする必要があります。この場合はclass Xインスタンスです。

第3引数が(コンテナ値を受け取り、boolを返す)単項述語であるようにするには、右の関数はstd::find_if()です。

std::find()の第3引数として単項述語を使用すると、コンパイラはclass Xインスタンスをラムダ関数と同じにしようとします。

です:コンパイラは、だから、コンパイルエラー

*(v.begin()) == [&](const X& o){return o.a == y;} 

をコンパイルしてみてください。

ですから、三番目の引数で、値が比較されることが予想され、std::findに固執したい場合は、比較を実行するoperator==を提供する必要が

std::find_if( // <-- std::find_if ! 
    v.begin(), 
    v.end(), 
    [&](const X& o){return o.a == y;} 
) == v.end() 
+0

std::findを変更好む:

(...) bool operator==(const X& x, int b) { return x.a == b; } 

をしてまでstd::findを変更します。

あなたはこのような何かを試すことができます!フォローアップの質問をすることができるのであれば、 'binary_search_if'のようなバイナリ検索のための' find_if'と同等のものがありますか? –

+0

@ Remi.b - 私が知っている限り...いいえ:そうではありません。 – max66

1

てみてください。あなたの+1をありがとう

std::find(
    v.begin(), 
    v.end(), 
    y 
) == v.end() 

が、私はちょうどstd::find_if

関連する問題