如果 vec2 很大或有很多重复元素(在此函数中一遍又一遍地无用地扫描),则对第二个向量进行排序并将其放入(无序)集合中可能更有效,以降低复杂性。
#include <vector>
#include <unordered_set>
#include <iostream>
#include <iterator>
#include <algorithm>
void overlap_removal(std::vector<int> &v1, const std::vector<int> &v2)
{
std::unordered_set<int> s(v2.begin(), v2.end());
v1.erase(std::remove_if(v1.begin(), v1.end(),
[&s](int i){return s.count(i);}),
v1.end());
}
int main()
{
std::vector<int> v1 = {5,6,3,2,3,5,1,2,1};
std::vector<int> v2 = {2,3};
overlap_removal(v1, v2);
copy(v1.begin(), v1.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
}
或者,保持 C++98
struct IsInSet {
const std::set<int>& m_s;
IsInSet(const std::set<int>& s) : m_s(s) {}
bool operator()(int i) const { return m_s.count(i); }
};
void overlap_removal(std::vector<int> &v1, const std::vector<int> &v2)
{
std::set<int> s(v2.begin(), v2.end());
v1.erase( std::remove_if(v1.begin(), v1.end(), IsInSet(s)), v1.end());
}