此代码始终返回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;
}
答案 0 :(得分:1)
if
中查看您的情况。你的意思是什么,它实际上做了什么?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 元素。之前的所有内容都已经过检查,您不应该将当前值与自身进行比较。