标准库的
头文件中提供了std::set_difference
,std::set_intersection
和std::set_union
用来求两个集合的差集,交集和并集。
正好有个需求,需要求在实体类集合A中,但是不再实体类集合B中的元素,可以使用上述方法来实现。
首先,来看下上述几个方法的简单使用。
std::vector v1{ 1,2,3,4,5,6,7,8 };
std::vector v2{ 5, 7, 9,10 };
std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end());
std::vector v_intersection;
std::set_intersection(v1.begin(), v1.end(),
v2.begin(), v2.end(),
std::back_inserter(v_intersection));
for (int n : v_intersection)
std::cout << n << ' ';
std::vector v_difference;
// v2 中有,v1中没有
set_difference(v1.begin(), v1.end(), v_intersection.begin(), v_intersection.end(), inserter(v_difference, v_difference.begin()));
cout << endl;
for (int n : v_difference)
cout << n << " ";
cout << endl;
声明两个vector
,set_*
方法需要集合是有序的,先调用sort
方法排序。后面的使用就比较简单了,调用set_intersection
传入两个集合的要进行交操作的区间,back_inserter
将两个集合的交集插入到v_intersection
中。
调用set_difference
查找在集合v1
中有,而v1
和v2
中交集没有的元素。
最后的输出结果如下:
5 7
1 2 3 4 6 8
自定义类型
上面的例子使用的是int
,在实际应用中,通常需要的自定义的类型。 如下:
struct Item {
string group;
string md5;
Item(const string &g, const string &m) {
group = g;
md5 = m;
}
bool operator<(const Item &_I) const {
if (group == _I.group) {
return md5 < _I.md5;
}
return group < _I.group;
}
};
自定义类型Item
的结构很简单,只有两个字段:group
和md5
。 然后重载了运算符<
方便排序,排序的规则是:group
不同,在按照group
字段排序; 如果group
相同,按照字段md5
排序。
测试代码如下:
Item i1("1", "111");
Item i2("1", "222");
Item i3("1", "333");
Item i4("2", "110");
Item i5("2", "220");
vector- list;
list.push_back(i4);
list.push_back(i1);
list.push_back(i2);
list.push_back(i5);
list.push_back(i3);
Item i6("3", "330");
Item i7("4", "440");
vector
- list1 = { i2, i4, i6, i7 };
sort(list.begin(), list.end());
sort(list1.begin(), list1.end());
cout << "list1:###" << endl;
for (auto i : list)
cout << "group:" << i.group << " md5:" << i.md5 << endl;
cout << "list2:###" << endl;
for(auto i : list1)
cout << "group:" << i.group << " md5:" << i.md5 << endl;
vector
- item_intersection;
set_intersection(list.begin(), list.end(), list1.begin(), list1.end(), back_inserter(item_intersection));
cout << "list1 和 list2 的交集: ###" << endl;
for(auto i : item_intersection)
cout << "group:" << i.group << " md5:" << i.md5 << endl;
vector
- item_difference;
set_difference(list.begin(), list.end(), item_intersection.begin(), item_intersection.end(), back_inserter(item_difference));
cout << "list1中有,而list2中没有的元素:###" << endl;
for(auto i : item_difference)
cout << "group:" << i.group << " md5:" << i.md5 << endl;
总结
并集(http://zh.cppreference.com/w/cpp/algorithm/set_union)
交集(http://zh.cppreference.com/w/cpp/algorithm/set_intersection)
差集(http://zh.cppreference.com/w/cpp/algorithm/set_difference)
inserter(http://zh.cppreference.com/w/cpp/iterator/inserter)
back_inserter(http://zh.cppreference.com/w/cpp/iterator/back_inserter)
上述代码中使用的几个方法详细描述。