算法简介:
set_intersection
:将两个容器的交集存储至新容器。
set_union
:将两个容器的并集存储至新容器。
set_difference
:将两个容器的差集存储至新容器。
作用:将两个容器的交集存储至新容器,并返回交集中最后1个元素的迭代器位置。
注1:使用
set_intersection
算法时,需包含头文件include
。
注2:使用set_intersection
算法时,需为目标容器提前开辟内存空间,交集元素个数至多为两容器大小的较小值
,如dest.resize( min(src1.size(), src2.size()) );
,否则程序运行时崩溃。
注3:使用set_intersection
算法时,两个源容器的元素必须有序且顺序一致,否则程序运行时崩溃。合并后,新容器中的元素仍有序。
注4:遍历新容器时,迭代器结束位置需使用交集的最后1个元素的迭代器位置,而不能使用新容器的结束迭代器,否则可能出现多余的填充值0
。
函数原型:
set_intersection(iterator begin1, iterator end1, iterator begin2, iterator end2, iterator dest);
参数解释:
begin1
:源容器1迭代器的起始位置;
end1
:源容器1迭代器的结束位置;
begin2
:源容器2迭代器的起始位置;
end2
:源容器2迭代器的结束位置;
dest
:目标容器迭代器的起始位置。
示例:
#include
using namespace std;
#include
#include //使用set_intersection算法
int main() {
//合并的两个源容器必须有序,且顺序一致,否则程序运行时崩溃
vector<int> src1;
for (int i = 0; i < 5; i++) {
src1.push_back(i); //0 1 2 3 4
}
vector<int> src2;
for (int i = 3; i < 8; i++) {
src2.push_back(i); //3 4 5 6 7
}
//合并前,需为目标容器提前分配内存空间
vector<int> dest;
//交集元素个数至多为两容器大小的较小值
dest.resize(min(src1.size(), src2.size()));
//求两容器元素的交集,返回交集最后1个元素的迭代器位置last
vector<int>::iterator last = set_intersection(src1.begin(), src1.end(), src2.begin(), src2.end(), dest.begin());
//遍历新容器时,迭代器结束位置需使用【交集】的最后1个元素的迭代器位置last
for_each(dest.begin(), last, [](int val) {cout << val << " "; }); //3 4
//不能使用新容器的结束迭代器dest.end(),否则可能出现多余的填充值0
//dest容器大小为5个,交集元素共2个,多余3个填充0值
//for_each(dest.begin(), dest.end(), [](int val) {cout << val << " "; }); //3 4 0 0 0
return 0;
}
作用:将两个容器的并集存储至新容器,并返回并集中最后1个元素的迭代器位置。
注1:使用
set_union
算法时,需包含头文件include
。
注2:使用set_union
算法时,需为目标容器提前开辟内存空间,并集元素个数至多为两容器大小的总和
,如dest.resize(src1.size() + src2.size());
,否则程序运行时崩溃。
注3:使用set_union
算法时,两个源容器的元素必须有序且顺序一致,否则程序运行时崩溃。合并后,新容器中的元素仍有序。
注4:遍历新容器时,迭代器结束位置需使用并集的最后1个元素的迭代器位置,而不能使用新容器的结束迭代器,否则可能出现多余的填充值0
。
函数原型:
set_union(iterator begin1, iterator end1, iterator begin2, iterator end2, iterator dest);
参数解释:
begin1
:源容器1迭代器的起始位置;
end1
:源容器1迭代器的结束位置;
begin2
:源容器2迭代器的起始位置;
end2
:源容器2迭代器的结束位置;
dest
:目标容器迭代器的起始位置。
示例:
#include
using namespace std;
#include
#include //使用set_union算法
int main() {
//合并的两个源容器必须有序,且顺序一致,否则程序运行时崩溃
vector<int> src1;
for (int i = 0; i < 5; i++) {
src1.push_back(i); //0 1 2 3 4
}
vector<int> src2;
for (int i = 3; i < 8; i++) {
src2.push_back(i); //3 4 5 6 7
}
//合并前,需为目标容器提前分配内存空间
vector<int> dest;
//并集元素个数至多为两容器大小的总和
dest.resize(src1.size() + src2.size());
//求两容器元素的并集,返回并集最后1个元素的迭代器位置last
vector<int>::iterator last = set_union(src1.begin(), src1.end(), src2.begin(), src2.end(), dest.begin());
//遍历新容器时,迭代器结束位置需使用【并集】的最后1个元素的迭代器位置last
for_each(dest.begin(), last, [](int val) {cout << val << " "; }); //0 1 2 3 4 5 6 7
//不能使用新容器的结束迭代器dest.end(),否则可能出现多余的填充值0
//dest容器大小为10个,并集元素共8个,多余2个填充0值
//for_each(dest.begin(), dest.end(), [](int val) {cout << val << " "; }); //0 1 2 3 4 5 6 7 0 0
return 0;
}
作用:将两个容器的差集存储至新容器,并返回差集中最后1个元素的迭代器位置。
注1:使用
set_difference
算法时,需包含头文件include
。
注2:使用set_difference
算法时,需为目标容器提前开辟内存空间,差集元素个数至多为两容器大小的较大值
,如dest.resize( max(src1.size(), src2.size()) );
,否则程序运行时崩溃。
注3:使用set_difference
算法时,两个源容器的元素必须有序且顺序一致,否则程序运行时崩溃。合并后,新容器中的元素仍有序。
注4:遍历新容器时,迭代器结束位置需使用差集的最后1个元素的迭代器位置,而不能使用新容器的结束迭代器,否则可能出现多余的填充值0
。
函数原型:
set_difference(iterator begin1, iterator end1, iterator begin2, iterator end2, iterator dest);
参数解释:
begin1
:源容器1迭代器的起始位置;
end1
:源容器1迭代器的结束位置;
begin2
:源容器2迭代器的起始位置;
end2
:源容器2迭代器的结束位置;
dest
:目标容器迭代器的起始位置。
示例:
#include
using namespace std;
#include
#include //使用set_difference算法
int main() {
//合并的两个源容器必须有序,且顺序一致,否则程序运行时崩溃
vector<int> src1;
for (int i = 0; i < 5; i++) {
src1.push_back(i); //0 1 2 3 4
}
vector<int> src2;
for (int i = 3; i < 8; i++) {
src2.push_back(i); //3 4 5 6 7
}
//合并前,需为目标容器提前分配内存空间
vector<int> dest;
//差集元素个数至多为两容器大小的较大值
dest.resize(max(src1.size(), src2.size()));
cout << "容器src1与容器src2的差集:" << endl;
//求两容器元素的差集,返回差集最后1个元素的迭代器位置last
vector<int>::iterator last = set_difference(src1.begin(), src1.end(), src2.begin(), src2.end(), dest.begin());
//遍历新容器时,迭代器结束位置需使用【差集】的最后1个元素的迭代器位置last
for_each(dest.begin(), last, [](int val) {cout << val << " "; }); //0 1 2
cout << endl;
//不能使用新容器的结束迭代器dest.end(),否则可能出现多余的填充值0
//dest容器大小为5个,差集元素共3个,多余2个填充0值
//for_each(dest.begin(), dest.end(), [](int val) {cout << val << " "; }); //0 1 2 0 0
cout << "容器src2与容器src1的差集:" << endl;
last = set_difference(src2.begin(), src2.end(), src1.begin(), src1.end(), dest.begin());
//遍历新容器时,迭代器结束位置需使用【差集】的最后1个元素的迭代器位置last
for_each(dest.begin(), last, [](int val) {cout << val << " "; }); //5 6 7
cout << endl;
//不能使用新容器的结束迭代器dest.end(),否则可能出现多余的填充值0
//dest容器大小为5个,差集元素共3个,多余2个填充0值
//for_each(dest.begin(), dest.end(), [](int val) {cout << val << " "; }); //5 6 7 0 0
return 0;
}