通过 lambda 删除矢量项

Removing Vector Items via a Lambda

本文关键字:删除 lambda 通过      更新时间:2023-10-16

我只是弄乱了一些lambda表达式,我决定尝试从向量中删除重复的元素。 但是,它不起作用。 我输入了一些调试日志记录,似乎 std::count 没有返回预期的结果。 任何将不胜感激。

作为参考,我知道这不是从矢量中删除项目的最有效方法! 我只是在尝试 lambda,因为我不像我想的那样了解它们。

谢谢!

#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
    std::vector<int> v = { 0, 0, 1, 2, 4, 4, 4 };
    std::remove_if(v.begin(), v.end(), [&v](const int &x) 
    { 
        return std::count(v.begin(), v.end(), x) > 1;
    });
    std::cout << "nnResult:n";
    for (const auto& i : v) { std::cout << i << std::endl; }
    return 0;
}

那是因为remove_if实际上并没有删除元素:

删除是通过移动(通过移动分配)

区域中的元素来完成的,以使不删除的元素出现在范围的开头。

这就是它返回迭代器的原因,因此您可以:

删除的调用通常后跟对容器的 erase 方法的调用,该方法将擦除未指定的值并减小容器的物理大小以匹配其新的逻辑大小。

那是:

v.erase(std::remove_if(v.begin(), v.end(), [&v](const int &x) 
{ 
    return std::count(v.begin(), v.end(), x) > 1;
}), v.end());

这被称为擦除删除习惯用语。

请注意,如果您只想删除重复项,并且您不关心保留顺序,则可以使用 std::sortstd::unique(您需要sort,因为unique只"删除"连续的重复元素):

std::sort(v.begin(), v.end());
v.erase(std::unique(v.begin(), v.end()), v.end());