2016-08-11 6 views
-2

でfind_if使用して、このコードは、常に私は参照することにより、ラムダパラメータを渡そうとしました falseを返すと私は同じ結果 を持っていた任意の先端くださいifであなたの条件でベクトルオブジェクト

vector<int> v1; 
v1.push_back(1); 
v1.push_back(2); 
v1.push_back(3); 
v1.push_back(5); 

for (int x : v1) 
{ 
    auto it = find_if(v1.begin(), v1.end(), [x](int y){ return x == y; }); 
    if (it != v1.end()) 
     return false; 

    return true; 
} 
+0

なぜあなたはそれが本当であると思いますか?デバッガを使用する – RiaD

+3

ここで何をしているのか少し考えてみてください。最初の反復では、 'x'は' 1'に等しくなります。そして、次の反復 'x'は' 2'となり、*も*見つかるでしょう。等々。ベクトル内にあるため、ベクトル内のすべての値が検出されます。値が見つかった場合は 'false'を返します。あなたは重複をチェックしていますか?その後、あなたのアルゴリズムを再考する必要があります。 –

+0

はい重複の有無を確認しています この機能を初めて使うときは、この機能を使うのを手伝ってください –

答えて

1

重複のチェック(だけでなく、彼らのためにチェックし、それらを削除)、あなたはこのような何かを行うことができますへの容器。最初の要素は、現在チェックしている要素なので、再度チェックしないでください。

重複が見つからない場合は、2番目の要素に進み、3番目の要素を前方にチェックします。最初の要素をチェックする必要はありません。これは前の手順で行われたためです。

次に、すべての要素について同様にします。

を見つけた場合は、検索を停止してtrueを返してください。何も見つからない場合は、終了まで続けてからfalseを返します。

これはイテレータを使用して簡単に行うことができます。

// Outer loop, current element to check 
for (auto const i = v1.begin(); i != v1.end(); ++i) 
{ 
    // Inner loop, the element to check against 
    for (auto const j = i + 1; j != v1.end(); ++j) 
    { 
     if (*i == *j) 
      return true; // Duplicate found 
    } 
} 

// No duplicates found 
return false; 

上記のコードは、原理を示し、あなたはもちろんのではなく、内側のループのstd::find_ifを使用することができます。重要なことは、の次の要素を調べることです。以前のものはすべてチェックされているので、現在の値とそれ自身を比較しないでください。

1
  1. ルック。あなたはそれが何を意味するのか、それは実際に何をしていますか?
  2. forを使用すると、すべてのコンテナを通過するように見えます。ループの本体がで最初の繰り返しですぐに復帰しないケースがありますか?

    が第1の値を取得し、残りでそれをチェック:

関連する問題