C++STL总结——常用算法——集合算法
包含头文件:algorithm
整合
//set_intersection(begin_01, end_01, begin_02, end_02, begin_03)
//求两个集合的交集
//两个集合必须是有序序列
//返回值为目标容器的结束迭代器
void set_intersection_test() {
vector<int> v1;
vector<int> v2;
vector<int> v3;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
v2.push_back(i+3);
}
//目标容器需要提前开辟空间
//开辟大小为两个容器中较小的
v3.resize(min(v1.size(), v2.size()));
vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
//for_each的第二个参数不用v3.end()是因为开辟空间的时候有可能多开辟
//而v3.end()会遍历多余的空间
//itEnd是交集的结束迭代器,不会有多余的遍历
for_each(v3.begin(), itEnd, print02());
}
//set_union(begin_01, end_01, begin_02, end_02, begin_03)
//求两个集合的并集
//两个集合必须是有序序列
//返回值为目标容器的结束迭代器
void set_union_test() {
vector<int> v1;
vector<int> v2;
vector<int> v3;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
v2.push_back(i+3);
}
//目标容器需要提前开辟空间
//开辟大小为两个容器大小之和
v3.resize(v1.size()+v2.size());
vector<int>::iterator itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
//for_each的第二个参数不用v3.end()是因为开辟空间的时候有可能多开辟
//而v3.end()会遍历多余的空间
//itEnd是并集的结束迭代器,不会有多余的遍历
for_each(v3.begin(), itEnd, print02());
}
//set_difference(begin_01, end_01, begin_02, end_02, begin_03)
//求两个集合的差集
//两个集合必须是有序序列
//返回值为目标容器的结束迭代器
//分为容器1和容器2的差集 & 容器2和容器1的差集
//容器1和容器2的差集:在容器1中却没在容器2中的
//容器1和容器1的差集:在容器2中却没在容器1中的
void set_difference_test() {
vector<int> v1;
vector<int> v2;
vector<int> v3;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
v2.push_back(i+3);
}
//目标容器需要提前开辟空间
//开辟大小为两个容器较大的
v3.resize(max(v1.size(), v2.size()));
vector<int>::iterator itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
//for_each的第二个参数不用v3.end()是因为开辟空间的时候有可能多开辟
//而v3.end()会遍历多余的空间
//itEnd是差集的结束迭代器,不会有多余的遍历
for_each(v3.begin(), itEnd, print02());
}
set_intersection
//set_intersection(begin_01, end_01, begin_02, end_02, begin_03)
//求两个集合的交集
//两个集合必须是有序序列
//返回值为目标容器的结束迭代器
void set_intersection_test() {
vector<int> v1;
vector<int> v2;
vector<int> v3;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
v2.push_back(i+3);
}
//目标容器需要提前开辟空间
//开辟大小为两个容器中较小的
v3.resize(min(v1.size(), v2.size()));
vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
//for_each的第二个参数不用v3.end()是因为开辟空间的时候有可能多开辟
//而v3.end()会遍历多余的空间
//itEnd是交集的结束迭代器,不会有多余的遍历
for_each(v3.begin(), itEnd, print02());
}
set_union
//set_union(begin_01, end_01, begin_02, end_02, begin_03)
//求两个集合的并集
//两个集合必须是有序序列
//返回值为目标容器的结束迭代器
void set_union_test() {
vector<int> v1;
vector<int> v2;
vector<int> v3;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
v2.push_back(i+3);
}
//目标容器需要提前开辟空间
//开辟大小为两个容器大小之和
v3.resize(v1.size()+v2.size());
vector<int>::iterator itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
//for_each的第二个参数不用v3.end()是因为开辟空间的时候有可能多开辟
//而v3.end()会遍历多余的空间
//itEnd是并集的结束迭代器,不会有多余的遍历
for_each(v3.begin(), itEnd, print02());
}
set_difference
//set_difference(begin_01, end_01, begin_02, end_02, begin_03)
//求两个集合的差集
//两个集合必须是有序序列
//返回值为目标容器的结束迭代器
//分为容器1和容器2的差集 & 容器2和容器1的差集
//容器1和容器2的差集:在容器1中却没在容器2中的
//容器1和容器1的差集:在容器2中却没在容器1中的
void set_difference_test() {
vector<int> v1;
vector<int> v2;
vector<int> v3;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
v2.push_back(i+3);
}
//目标容器需要提前开辟空间
//开辟大小为两个容器较大的
v3.resize(max(v1.size(), v2.size()));
vector<int>::iterator itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
//for_each的第二个参数不用v3.end()是因为开辟空间的时候有可能多开辟
//而v3.end()会遍历多余的空间
//itEnd是差集的结束迭代器,不会有多余的遍历
for_each(v3.begin(), itEnd, print02());
}