我想使用 C++ 执行多集交集

I want to perform a multi-set intersection using C++

我正在使用 std::set<int> 和多集 类 std::multiset<int> 来执行一些集合操作 - 并集、交集等。问题是我必须在两个多集之间执行交集- 设置这样我也得到重复的值。当我将它与简单集(而不是多集)一起使用时,交集工作正常,例如

组 1={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}

虽然我使用多集来保存交集的结果,但我仍然得到了错误的答案。

谁能告诉我如何解决这个问题。

请您post检查您的代码是否有错误? 我已经像下面的代码一样编写了一个交集示例并且它有效。

multiset<int> ms1;
ms1.insert(1);
ms1.insert(1);
ms1.insert(1);
ms1.insert(2);
ms1.insert(3);

multiset<int> ms2;
ms2.insert(1);
ms2.insert(1);
ms2.insert(2);
ms2.insert(2);
ms2.insert(4);

vector<int> v(10);
set_intersection( ms1.begin(), ms1.end(), ms2.begin(), ms2.end(), v.begin() );

结果是 1, 1, 2. 这是正确的!

set_intersection 实际上也为多重集执行交集。我认为您对 set_intersection 的调用是错误的。参考资料中描述了您必须满足的一些要求,例如:

The resulting range cannot overlap with either of the input ranges.

不过,请看下面的代码:

#include <iostream>
#include <iterator> // inserter
#include <algorithm> // set_intersection
#include <set> // multiset

int main() {
    std::multiset<int> set1 = { 1,1,2,2,3,3,4,4,5,5,6,6 };
    std::multiset<int> set2 = { 4,4,5,5,6,6,7,7,8,8,9,9 };
    std::multiset<int> intersection;
    std::set_intersection(set1.begin(), set1.end(), set2.begin(), set2.end(), std::inserter(intersection, intersection.begin()));

    // prints: 4 4 5 5 6 6 
    for(int elem : intersection) {
        std::cout << elem << ' ';
    } 
}