2016-08-11 51 views
-2

此代碼始終返回false 我試圖通過引用傳遞拉姆達參數和我有同樣的結果 任何提示請使用find_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

檢查重複項(不刪除它們,只查詢到),那麼你可以做這樣的事情:

獲得的第一個值,並在其餘檢查它的容器。你不應該再檢查第一個元素,因爲這是我們目前正在檢查的元素。

如果找不到重複,則繼續第二個元素,並從第三個元素轉發中檢查。我們不需要檢查第一個元素,因爲這是在上一步中完成的。

然後繼續像所有元素一樣。

如果您發現找到重複,則停止搜索並返回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. 看在if你的病情。你的意思是要做什麼以及它實際上做了什麼?
  2. 從使用for看起來好像你想要它遍歷所有的容器。你可以找到一個案例,其中迴路的主體不是立即返回第一次迭代?