从另一个向量中删除向量元素

3

我想删除向量v中所有包含在v2中的元素;

这个解决方案好吗,还是应该使用其他方法?

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    std::vector<int> v = {1,2,3,4,5,1,2};
    std::vector<int> v2 = {1,2,3};
    
    v.erase(std::remove_if(v.begin(), v.end(), [v2](int x)
    {   
        auto it = std::find(v2.begin(), v2.end(), x);
        return it != v2.end();  
    }), v.end());
    
    for (auto i : v)
    {
        std::cout<<i<< " ";
    }

    return 0;
}

输出:

4 5

1
注意:来自重复的答案仅适用于已排序的向量。如果您想处理非排序向量,则您的尝试可能是最好的。 - Yksisarvinen
因为@Yksisarvinen的论点而重新开放。 - Howard Hinnant
1
“这个解决方案好不好?”你如何定义“好”? - paolo
1
@KarlD -- 你有一个7个元素的向量和一个3个元素的向量。除非你实际上处理数千或数百万个元素,否则你的测试用例是微不足道的,因此任何东西都是“快速”或足够好的。 - PaulMcKenzie
@KarlD 为什么你不能将集合差的结果赋值给第一个向量变量?在这种微小数据情况下,功能上有何区别? - scohe001
1个回答

1

对于小型过滤器来说,v2非常好。如果通过引用传递v2,效果会更好一些。

v.erase(std::remove_if(v.begin(), v.end(), [&v2](int x)
{   
    std::find(v2.begin(), v2.end(), x) != v2.end();  
}), v.end());

如果 v2 很大,最好将其替换为 std::unordered_set<int> s。它还会删除 v2 中的重复项。
#include <iostream>
#include <algorithm>
#include <vector>
#include <unordered_set>

using namespace std;

int main()
{
    std::vector<int> v = {1,2,3,4,5,1,2};
    std::vector<int> v2 = {1,2,3};
    std::unordered_set<int> s(v2.begin(), v2.end());
    
    v.erase(std::remove_if(v.begin(), v.end(), [&s](int x) { return s.count(x); }),
            v.end());
    
    for (auto i : v)
    {
        std::cout<<i<< " ";
    }

    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接