首页 > 解决方案 > set_difference 问题,不返回所有值或重复项

问题描述

我正在尝试使用数组并将第一个(bag1)和第二个(bag2)数组中没有出现的整数输出到新的第三个(newbag)数组中。该函数没有给我正确的区别。如果一个袋子有更多特定数量,它还需要包含任何重复项。

我的输出缺少列表中的重复项:

Bag 1: 1 3 3 4 5 5 7 7 8 9 9 11 12 12 12 16
Bag 2: -100 -4 1 3 3 4 5 6 7 8 8 9 11 12 12 12 15 19
Difference Bag: -100 -4 6 8 15 19

我试过改变袋子的顺序,但它们正确的数字永远不会输出。

const ArrayBag ArrayBag ::operator - (const ArrayBag bag){
    ArrayBag newBag;
    vector<int> diff;
    set_difference(items,items + getCurrentSize(),bag.items,bag.items + 
    bag.getCurrentSize(),
                 inserter(diff,diff.begin()));

    for (int i = 0; i < diff.size(); i++) {
      newBag.add(diff[i]);
    }
    return(newBag);

标签: c++

解决方案


您没有使用正确的功能。你需要std::set_symmetric_difference得到两组的差异。当你使用set_difference它时,它只复制第一组中没有在第二组中找到的元素。使用std::set_symmetric_difference它会将两个集合中都不存在的元素复制到一个新集合中。您可以通过以下方式看到:

int main()
{
    std::vector<int> v1{1, 3, 3, 4, 5, 5, 7, 7, 8, 9, 9, 11, 12, 12, 12, 16};
    std::vector<int> v2{-100, -4, 1, 3, 3, 4, 5, 6, 7, 8, 8, 9, 11, 12, 12, 12, 15, 19};

    std::vector<int> v_symDifference;

    std::set_symmetric_difference(
        v1.begin(), v1.end(),
        v2.begin(), v2.end(),
        std::back_inserter(v_symDifference));

    for(int n : v_symDifference)
        std::cout << n << ' ';
}

哪个输出

-100 -4 5 6 7 8 9 15 16 19 

你可以在这个活生生的例子中看到它的实际效果


推荐阅读