【发布时间】:2017-01-21 17:18:51
【问题描述】:
我正在使用std::set<int> 和多集类std::multiset<int> 执行一些集合操作——联合、交集等。问题是我必须在两个多集之间执行交集,这样我也会得到重复的值.当我将它与简单集合(而不是多集合)一起使用时,交叉点可以正常工作,例如
Set1={1,2,3,4,5,6}
Set2={4,5,6,7,8,9}
那么
std::set_intersection 给我一个正确的结果是 {4,5,6}
但是,如果我有一个多重集
多组1{1,1,2,2,3,3,4,4,5,5,6,6}
多集2{4,4,5,5,6,6,7,7,8,8,9,9}
我再次使用 std::set_intersection 它再次给了我结果 {4,5,6}
这是不正确的,因为实际的交点是{4,4,5,5,6,6}
虽然我使用多重集来保存交集的结果,但我仍然得到错误的答案。
谁能告诉我如何解决这个问题。
【问题讨论】:
-
作为一种解决方法,您的实现是否允许使用 std::set 向量,然后 set_intersection 将返回包含您需要的所有元素的向量?
-
那么对于每个
{elememt,count},您想要输出中两个多重集之间的最小计数吗? -
谢谢,也许每个人都可以使用向量来完成,但我更喜欢使用集合的解决方案,因为它们在我的代码中无处不在。我只想得到我在示例中显示的结果。我不希望重复的元素被视为重复元素,而是一个单独的数字。 @Yakk 是的,就像你刚才说的那样
-
你一定是做错了什么。
set_intersection明确指定具有您正在寻找的行为。 -
"构造一个从 d_first 开始的排序范围,包含在排序范围 [first1, last1) 和 [first2, last2) 中找到的元素。如果某个元素在 [first1, last1] 中找到 m 次) 和 [first2, last2) 中的 n 次,第一个 std::min(m, n) 元素将从第一个范围复制到目标范围。保留等效元素的顺序。结果范围不能与任何一个重叠输入范围。”,是的,非常清楚。提供minimal reproducible example
标签: c++ set multiset set-intersection