我有一系列数组
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);
问题是我不知道这个函数可以调用什么,如果它确实存在,或者最接近它的是什么。
答案 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