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

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

本文关键字:执行 C++      更新时间:2023-10-16

我正在使用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}

但是,如果我有一个多集

multi-set1{1,1,2,2,3,3,4,4,5,5,6,6}
multi-set2{4,4,5,5,6,6,7,7,8,8,9,9}

我再次使用 std::set_intersection它再次给我结果 {4,5,6}

这是不正确的,因为实际的交集是{4,4,5,5,6,6}

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

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

请您发布您的代码以检查是否有错误吗?我已经编写了一个交叉示例,如下所示的代码,它可以工作。

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的呼吁是错误的。您必须满足的一些要求,如参考中所述,例如:

生成的范围不能与任一输入范围重叠。

但是,请参阅以下代码:

#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 << ' ';
    } 
}