说我有vector<class1a>,vector<class1b>如何删除它们的公共实体我为class1对象class1a,class1b定义了==运算符
在STL算法提供多种功能进行设定操作,特别是计算集对称差,这是你所需要的.
这是一个使用示例:
#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;
}
Run Code Online (Sandbox Code Playgroud)
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());
Run Code Online (Sandbox Code Playgroud)
在这里,我们将设置差异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"
Run Code Online (Sandbox Code Playgroud)
我想有更多高性能的解决方案,但这一点很清楚,并且通过使用广为人知的stl算法真正传达了你的意图.
| 归档时间: |
|
| 查看次数: |
3644 次 |
| 最近记录: |