2016-08-11 49 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看起来好像你想要它遍历所有的容器。你可以找到一个案例,其中回路的主体不是立即返回第一次迭代?