gpt4 book ai didi

c++ - 从两个 vector 中删除公共(public)实体?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:25 24 4
gpt4 key购买 nike

假设我有 vector<class1a>,vector<class1b>如何从它们中删除公共(public)实体我已经为 class1 对象 class1a,class1b 定义了 ==operator

最佳答案

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。它还返回一个指向结果范围末尾的迭代器。


编辑

我刚刚阅读了您对您的问题的评论。如果要修改两个原始 vector ,可以使用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的交集,然后与这个交集的差 std::set_intersection :

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 算法真正传达了您的意图。

关于c++ - 从两个 vector 中删除公共(public)实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/641724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com