说我有vector
如何删除它们的公共实体我为class1对象class1a,class1b定义了==运算符
在STL算法提供多种功能进行设定操作,特别是计算集对称差,这是你所需要的.
这是一个使用示例:
#include#include int main(int argc, char **argv) { std::vector 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 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 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 (cout, " ")); // Prints "1 3 5" return 0; }
std::set_symmetric_difference
需要两个范围(即两对OutputIterators)和一个InputIterator来放置结果.它还将迭代器返回到结果范围的末尾.
编辑
我刚看了你对你问题的评论.如果要修改两个原始矢量,可以使用std::set_difference
:
vector::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的交点,然后计算与此交点的差异:
vectorinter; 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算法真正传达了你的意图.