从第一个集合中删除第二个集合中包含的元素,不迭代
Remove elements from first set element which second set contains without iteration
我有两组对(我不能使用c++11)
std::set<std::pair<int,int> > first;
std::set<std::pair<int,int> > second;
和我需要从第一个集合中删除第二个集合中的所有元素(如果第一个包含第二个要删除的元素)。我可以通过迭代第二个集合来做到这一点,如果第一个集合包含相同的元素,从第一个元素中删除,但我想知道有没有办法不迭代做到这一点?
如果我理解正确的话,基本上你想计算第一和第二的差。这里有一个<algorithm>
函数。
std::set<std::pair<int, int>> result;
std::set_difference(first.begin(), first.end(), second.begin(), second.end(), inserter(result, result.end()));
可以。
如果您想删除,而不仅仅是检测,这是这里的另一个<algorithm>
函数:remove_copy_if():
恕我直言。要理解它的工作原理并不难。
我想知道有没有办法不用迭代就能做到这一点。
。在内部,集合是平衡二叉树——没有办法在不迭代结构的情况下对它们进行操作。(我假设您对实现的效率感兴趣,而不是代码的便利性,所以我故意忽略了必须在内部迭代的库例程)。
集合是排序的,所以你可以在每个集合上进行迭代,删除(所以# operations是集合大小的总和),而不是迭代和查找每个元素(其中操作次数是你迭代的元素数量乘以另一个集合中元素数量的log以2为底)。只有当你的一个集合比另一个集合小得多时,迭代/查找方法才会胜出。如果你看一下你的库的set_difference
函数的实现(在Amen的回答中提到),它应该会告诉你如何很好地完成这两个迭代。
如果你想要更有效的东西,你需要考虑如何更早地实现这一点:例如,将你的对作为标志存储在相同大小的二维矩阵中,这样你就可以与第二个集合的负数进行AND运算。这是否实际取决于您要存储的int值的范围,所需的内存量是否适合您的目的....
相关文章:
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- c++找不到具有相同哈希的无序集合元素
- 从C++无序集合中高效提取元素
- 如何在比较时更改集合元素的值(在 c++ 中)?
- 打印无序映射的第二个元素,即集合
- 在集合中查找使用结构C++的元素
- 如何在集合中迭代替代元素(或进行特定大小的飞跃)?
- 消除集合的第一个元素
- 将集合的随机元素添加到列表中,然后将其从原始集合中移除
- 将字符串集合中的元素添加到字符串集合的向量中
- C++ 如何以特定模式遍历矢量的不同集合元素
- 为什么编译器不优化集合元素上的空范围循环?
- 集合元素类中定义的集合的比较器
- 修改集合元素
- 如何更改集合元素
- groot集合-元素访问
- 在迭代器上是否有STL适配器调用每个集合元素的回调
- 将多个集合元素合并为一个集合
- 使用哪种类型的指针来实现对集合元素的共享访问
- 在没有默认构造函数时初始化 STL 集合元素(不是指针)