是否有任何优雅的方法可以减去包含重复元素的std::vector
?
示例:
v1 = { 3, 1, 2, 1, 2, 2 }
v2 = { 2, 4, 3, 3, 3 }
result1 = ??( v1, v2 )
result2 = ??( v2, v1 )
我希望结果是:
result1 = { 1, 1 }
result2 = { 4 }
我当前(也很慢)的解决方案:
1) sort v1 and v2
2) use std::unique_copy to v1_uniq, v2_uniq
3) intersect the new vectors with std::set_intersection
4) iterate over v1 and v2 and remove all elements, that are in the intersection 3)
我的另一个想法是:
1) sort v1 and v2
2) iterate over v1 and v2 and remove duplicates in parallel
但这有点容易出错,对我来说并不优雅。
还有其他想法吗?
答案 0 :(得分:4)
您可以将std::copy_if与一元谓词一起使用,以检查该元素是否在第二个向量中。或者,如果您没有C ++ 11支持,请使用std::remove_copy_if并适当更改谓词的逻辑。
对于一元谓词:
struct Foo {
Foo(const std::vector& v) : v_(v) {}
bool operator() (int i) const {
// return true if i is in v_
}
const std::vector<int>& v_;
};
可以像这样实例化:
Foo f(v2);
您可以修改仿函数以保留参考向量的排序版本,并使用唯一条目进行二进制搜索,但总体思路是相同的。
答案 1 :(得分:2)
我有一个相当简单的算法,其复杂度为O(n²)。但是,排序(O(n log n))可以更快。这是:
substract s from v
for all elements of v
for all elements of s
if element i-th of v == element j-th of s
then remove it from v and break the loop on s
对于其他结构,也许它可能更快。例如,如果共享元素,则可以分离与s共享的v的所有元素,具有O(n)复杂度。