生成出现在每个集合中的一组集合

时间:2018-05-13 06:22:02

标签: c++ algorithm std

我有一系列数组

typedef std::vector<thing> group;

std::vector<group> groups;
事情可以这样比较

int comparison(thing a, thing b);

返回值为0, 1 or 2

0意味着事情不一样

1表示它们相似且a更具体或等于b

2表示它们相似且b更具体或等于a

我正在寻找一个函数,它会返回一个包含每个组中出现的所有内容的组。

std::getgroup(groups.begin(), groups.end(), myComparisonFunction);

问题是我不知道这个函数可以调用什么,如果它确实存在,或者最接近它的是什么。

1 个答案:

答案 0 :(得分:1)

最终,你想要的是一个交集。幸运的是,std::set_intersection几乎可以满足您的需求。这是std::vector<std::vector<int>>上的一个简单示例。您可以轻松更改它以使用thing

#include <iostream>
#include <vector>
#include <algorithm>

std::vector<int> getGroup(const std::vector<std::vector<int>>& groups) {

    std::vector<int> group;
    std::vector<int> temp = groups[0];
    std::sort(temp.begin(), temp.end());

    for ( unsigned i = 1; i < groups.size(); ++i ) {

        group = std::vector<int>();

        std::vector<int> temp2 = groups[i];
        std::sort(temp2.begin(), temp2.end());

        std::set_intersection(temp2.begin(), temp2.end(),
                              temp.begin(), temp.end(),
                              std::back_inserter(group));


        temp = group;

    }

    return group;

}

int main() {

    std::vector<std::vector<int>> groups = { {1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
                                             {1, 2, 3,    5, 6, 7, 8,    10},
                                             {1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
                                             {1,    3, 4, 5, 6,       9, 10},
                                             {1, 2,          6, 7, 8, 9, 10},
                                             {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} };

    for ( auto g : getGroup(groups) )
        std::cout << g << "\n";

    return 0;

}

这将打印:

  

1
  6
  10