说我有vector<class1a>,vector<class1b>
如何从两者中删除公共实体
我为class1对象class1a,class1b
答案 0 :(得分:8)
stl algorithms提供了几个函数来执行集合操作,特别是计算set symmetric difference,这就是你需要的。
以下是使用示例:
#include <algorithm>
#include <vector>
int main(int argc, char **argv) {
std::vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(5);
v1.push_back(6);
std::vector<int> v2;
v2.push_back(2);
v2.push_back(4);
v2.push_back(6);
v2.push_back(8);
// Ranges must be sorted!
std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end());
std::vector<int> res; // Will contain the symmetric difference
std::set_symmetric_difference(v1.begin(), v1.end(),
v2.begin(), v2.end(),
std::back_inserter(res));
// Copy result to the output
std::copy(res.begin(), res.end(), std::ostream_iterator<int>(cout, " "));
// Prints "1 3 5"
return 0;
}
std::set_symmetric_difference
需要两个范围(即两对OutputIterators)和一个InputIterator,它将放置结果。它还将迭代器返回到结果范围的末尾。
修改强>
我刚看了你对你问题的评论。如果您想要修改两个原始矢量,可以使用std::set_difference
:
vector<int>::iterator endRange;
endRange = set_difference(v1.begin(), v1.end(),
v2.begin(), v2.end(),
v1.begin());
v1.erase(endRange, v1.end());
这里,我们将设置差异v1-v2的结果放入v1。但是,我们不能反之亦然,因为现在修改了v1。解决方案是计算v1和v2的交点,然后计算与此交点的差异:
vector<int> inter;
set_intersection(v1.begin(), v1.end(),
v2.begin(), v2.end(),
back_inserter(inter));
// inter is "2 4 6"
v1.erase(set_difference(v1.begin(), v1.end(),
inter.begin(), inter.end(),
v1.begin())
v1.end());
// v1 is "1 3 5"
v2.erase(set_difference(v2.begin(), v2.end(),
inter.begin(), inter.end(),
v2.begin())
v2.end());
// v2 is "8"
我想有更多高性能的解决方案,但是这个解决方案很清楚,并且通过使用广为人知的stl算法真正传达了你的意图。
答案 1 :(得分:1)
在stl头算法中有一个名为“set_symmetric_difference”的函数,它将一个但不是两个源范围的所有元素放在一个目标范围内。
请记住,两个范围都必须开始排序。
答案 2 :(得分:0)
对2个向量进行排序,然后并行执行常见的合并操作。这将告诉你哪些项目是相同的。
答案 3 :(得分:0)
天真的方法是进行n ^ 2迭代,将第一个向量中的每个元素与第二个数组中的每个元素进行比较,并将任何匹配添加到第三个向量。当你完成n ^ 2次迭代时,你走第三个向量并从前两个中删除那些对象。
不是最好的解决方案,但取决于您对矢量的期望大小,它可能是最简单的。
答案 4 :(得分:0)
对于class1a
和class1b
中的每对项目,如果它们不相等,请将它们添加到输出集。否则,只添加一个这样的实例。重复最小的数组长度。如果一个更长,你会留下更多 - 尝试将所有这些添加到集合中。
答案 5 :(得分:0)
开始在Set中添加vector的值。重写class1和class2的equals方法以决定你希望对象如何相等。如果你不默认覆盖equals ==将用于比较,因为对象是不同的类==将始终返回false。所以你需要覆盖equals方法。