通过Lambda删除矢量项

时间:2015-04-13 20:35:34

标签: c++ vector

我只是搞乱了一些lambda表达式,我决定尝试从向量中删除重复的元素。但是,它不起作用。我输入了一些调试日志,看起来std :: count并没有返回预期的结果。任何人都会非常感激。

作为参考,我知道这不是从矢量中删除项目的最有效方法!我只是在尝试使用lambdas,因为我并不理解它们。

谢谢!

#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 << "\n\nResult:\n";
    for (const auto& i : v) { std::cout << i << std::endl; }

    return 0;
}

1 个答案:

答案 0 :(得分:2)

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

  

通过移动(通过移动分配)范围内的元素来完成移除,使得不被移除的元素出现在范围的开头。

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

  

调用remove之后通常会调用容器的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());

这称为Erase-remove idiom

请注意,如果您只想删除重复内容,而不关心保留订单,则可以使用std::sortstd::unique(需要sort,因为unique仅“删除”连续重复元素):

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