将find_if与向量对象一起使用

时间:2016-08-11 07:37:35

标签: c++11

此代码始终返回false 我试图通过引用传递lambda参数,我得到了相同的结果 请提示

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;
}

2 个答案:

答案 0 :(得分:1)

  1. if中查看您的情况。你的意思是什么,它实际上做了什么?
  2. 从使用for开始,您希望它能够覆盖所有容器。你能找到第一次迭代时循环体没有立即返回的情况吗?

答案 1 :(得分:1)

检查是否有重复项(不删除它们,只需检查它们),然后您可以执行以下操作:

获取第一个值,并在容器的 rest 中进行检查。你不应该再次检查第一个元素,因为那是我们当前正在检查的元素。

如果找不到副本,则转到第二个元素,然后从第三个​​元素向前检查。我们不需要检查第一个元素,因为这是在上一步中完成的。

然后对所有元素继续这样做。

如果您找到副本,请停止搜索并返回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而不是内部循环。重要的是开始查看 next 元素。之前的所有内容都已经过检查,您不应该将当前值与自身进行比较。