从第一组元素中删除第二组包含的元素而不进行迭代

时间:2013-03-23 18:03:56

标签: c++ stl

我有两组配对(我不能使用c ++ 11)

std::set<std::pair<int,int> > first;
std::set<std::pair<int,int> > second;

我需要从第一组中删除第二组中的所有元素(如果首先包含要从第二组删除的元素)。我可以通过迭代第二个集合来完成这个,如果第一个元素首先包含相同的元素擦除,但我想知道有没有办法在没有迭代的情况下做到这一点?

3 个答案:

答案 0 :(得分:7)

如果我理解正确,基本上你想要计算第一和第二的差异。有一个<algorithm>功能。

std::set<std::pair<int, int>> result;
std::set_difference(first.begin(), first.end(), second.begin(), second.end(), inserter(result, result.end()));

答案 1 :(得分:1)

  

我想知道没有迭代就可以做到这一点。

没有。在内部,集合是平衡的二叉树 - 没有迭代结构就无法对它们进行操作。 (我假设你对实现的效率感兴趣,而不是代码的方便性,所以我故意忽略了必须在内部迭代的库例程。)

集合虽然是排序的,所以你可以对每个集合进行迭代,随时删除(所以#operations是集合大小的总和)而不是迭代和每个元素的查找(其中操作数是数字)你迭代的元素的数量是另一组中元素数量的2的基数。只有当你的一个集合比另一个集合小得多时,迭代/查找方法才会胜出。如果你看一下Amen的答案中提到的库set_difference函数的实现) - 它应该向你展示如何很好地完成两次迭代。

如果你想要更高效的东西,你需要考虑如何更早地实现:例如,将你的对作为标志存储在相同大小的二维矩阵中,这样你就可以对第二组的否定进行AND。这是否实际取决于您存储的int值的范围,所需的内存量是否适合您的目的....

答案 2 :(得分:1)

是的,你可以。

如果你想删除,而不仅仅是为了检测,那就是另一个<algorithm>功能: remove_copy_if()

http://www.cplusplus.com/reference/algorithm/remove_copy_if/

IMHO。理解它是如何工作的并不是那么难。