C++ 从第二个集合包含的第一个集合元素中删除元素,无需迭代

C++ 从第二个集合包含的第一个集合元素中删除元素,无需迭代,c++,stl,C++,Stl,我有两组对(我不能使用c++11) std::先设置; std::设置第二; 我需要从第一个集合中删除第二个集合中的所有元素(若第一个集合包含要删除的第二个集合中的元素)。我可以通过迭代第二个集合来实现这一点,如果第一个集合包含来自第一个元素的相同元素擦除,但我想知道有没有不进行迭代就能实现这一点的方法?如果我理解正确,基本上你想要计算第一个和第二个的差值。有一个函数用于此 std::set<std::pair<int, int>> result; std::set_d

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

std::先设置;
std::设置第二;

我需要从第一个集合中删除第二个集合中的所有元素(若第一个集合包含要删除的第二个集合中的元素)。我可以通过迭代第二个集合来实现这一点,如果第一个集合包含来自第一个元素的相同元素擦除,但我想知道有没有不进行迭代就能实现这一点的方法?

如果我理解正确,基本上你想要计算第一个和第二个的差值。有一个
函数用于此

std::set<std::pair<int, int>> result;
std::set_difference(first.begin(), first.end(), second.begin(), second.end(), inserter(result, result.end()));
std::设置结果;
设置差异(first.begin(),first.end(),second.begin(),second.end(),inserter(result,result.end());
我想知道有没有不经过迭代就能做到这一点的方法

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

不过,集合是经过排序的,因此您可以对每个集合进行迭代,边进行边删除(因此#operations是集合大小的总和),而不是对每个元素进行迭代和查找(其中operations是您迭代的元素数乘以另一个集合中元素数的log base 2)。只有当其中一个集合比另一个集合小得多时,迭代/查找方法才会获胜。如果您查看Amen的答案中提到的库的
set_difference
函数)的实现,它应该会告诉您如何很好地完成这两个迭代

如果您想要更高效的东西,您需要考虑如何更早地实现这一点:例如,将对作为标志存储在大小相同的二维矩阵中,这样您就可以使用第二个集合的求反。这是否实用取决于您存储的int值的范围,以及所需的内存量是否适合您的目的

是的,你可以

如果您想删除,而不仅仅是检测,这是另一个


伊姆霍。理解它是如何工作的并不难。

这实际上并没有从第一个集合中删除元素,但我认为它已经尽可能好了。@Oswald:好吧,你总是可以
swap(first,result)
after;)“集合是平衡的二叉树——如果不遍历结构,就无法对它们进行操作”——这对于二叉树来说是一个奇怪的说法。对链表的描述听起来更贴切。当然,这取决于你对“操作”的定义。它是否排除搜索、插入和删除元素?@BenjaminLindley:取决于您对操作和迭代的定义。。。树基本上是一个递归的1对多链表-我的观点是,您只能通过上下跟踪链接来移动/迭代它。。。没有对哈希表或数组的随机/直接访问。如果
std::set
上的
std::remove\u,则不能使用它,因为它的元素是常量。但是,您可以使用。是的,这是我的错,如果不适用于关联容器,请删除_)
std::set<std::pair<int, int>> result;
std::set_difference(first.begin(), first.end(), second.begin(), second.end(), inserter(result, result.end()));