Если 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());
}