C++ 笔记 23 (STL常用算法 - 算术生成 & 集合)

五. STL-常用算法

5. 常用算术生成算法

算术生成算法属于小型算法,使用时包含的头文件为 :
#include < numeric >

accumulate  //计算容器元素累计总和
fill        //向容器中添加元素
5.1 accumulate

功能:计算区间内容器元素累计总和
原型:

accumulate(iterator beg ,iterator end ,value);
//其中value是起始值

int total = accumlate (v.begin(),v.end(),0);

总结:accumulate 使用时头文件是numeric,这个算法很使用

5.2 fill

功能:向容器中填充指定的元素
原型:

fill (iterator beg , iterator end , value);
//其中value是填充的值

fill(v.begin(), v.end(),100);

总结:利用fill可以将容器区间内元素填充为指定的值

6. 常用集合算法

set_intersection   //求两个容器的交集
set_union          //求两个容器的并集
set_difference     //求两个容器的差集
6.1 set_intersection

功能:求两个容器的交集
原型:

set_intersection(iterator beg1, iterator end1, iterator beg2, 
					iterator end2, iterator dest);
//两个集合必须是有序序列,其中iterator dest是目标容器开始迭代器

示例:

//取两个里面较小的值给目标容器开辟空间
vTarget.resize(min(v1.size(),v2.size()));

//返回目标容器的最后一个元素的迭代器地址
vector<int>::iterator itEnd = set_intersection(v1.begin(),v1.end()),v2.begin(),v2.end(),
		vTarget.begin());

总结:
1)求交集的两个集合必须是有序序列;
2)目标容器开辟空间需要从两个容器中取最小值
3)set_intersecton返回值是交集中最后一个元素的位置

6.2 set_union

功能:求两个集合的并集
原型:

set_union(iterator beg1, iterator end1, iterator beg2, 
					iterator end2, iterator dest);
//两个集合必须是有序序列

//取两个容器的和给目标容器开辟空间
vTarget.resize(v1.size() + v2.size());

//返回目标容器的最后一个元素的迭代器地址
vector<int>::iterator itEnd = set_union(v1.begin(),v1.end()),v2.begin(),v2.end(),
		vTarget.begin());

总结:
1)求并集的两个集合必须是有序序列;
2)目标容器开辟空间需要两个容器相加
3)set_union返回值是并集中最后一个元素的位置

6.3 set_difference

功能:求两个集合的差集
原型:

set_difference(iterator beg1, iterator end1, iterator beg2, 
					iterator end2, iterator dest);
//两个集合必须是有序序列

//取两个里面较大的值给目标容器开辟空间
vTarget.resize(max(v1.size(),v2.size()));

//返回目标容器的最后一个元素的迭代器地址
vector<int>::iterator itEnd = set_union(v1.begin(),v1.end()),v2.begin(),v2.end(),
		vTarget.begin());

总结:
1)求差集的两个集合必须是有序序列;
2)目标容器开辟空间需要从两个容器中取较大值
3)set_difference返回值是差集中最后一个元素的位置