文章目录
- STL常用算法——算术生成算法和集合算法
- 1、算术生成算法
- 1.1、accumulate()
- 1.2、fill()和fill_n()
- 2、集合算法
- 2.1、set_intersection()
- 2.2、set_union()
- 2.3、set_difference()
STL常用算法——算术生成算法和集合算法
1、算术生成算法
1.1、accumulate()
accumulate():计算区间内容器元素累计总和
函数原型:
accumulate(iterator beg,iterator end,value);
参数说明:
- beg 开始迭代器
- end 结束迭代器
- value 累加的初值
void test01() {
vector<int> v;
for (int i = 0; i <= 10; i++) {
v.push_back(i);
}
int total = accumulate(v.begin(), v.end(), 40);
cout << "total=" << total << endl;
}
1.2、fill()和fill_n()
fill()函数:向整个容器中填充指定的元素
函数原型:
fill(iterator beg,iterator end,value);
参数说明:
- beg 开始迭代器
- end 结束迭代器
- value 填充的值
void printV(int val) {
cout << val << " ";
}
void test01() {
vector<int> v;
v.resize(8);
fill(v.begin(), v.end(), 8);
for_each(v.begin(), v.end(), printV);
cout << endl;
}
fill_n()函数: 则以给定的迭代器为起始位置,将容器中指定数量(小于容器大小)的元素设置为给定的值。
函数原型:
fill_n(iterator beg, n, value);
参数说明:
- beg 开始迭代器
- end 设置值的数量
- value 填充的值
void myPrint(int val) {
cout << val << " ";
}
void test01() {
vector<int> v(8, 7);
fill_n(v.begin(), 4, 20);
for_each(v.begin(), v.end(), myPrint);
}
2、集合算法
2.1、set_intersection()
set_intersection()函数:求两个容器元素的交集
函数原型:
set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
参数说明:
- beg1 容器1的开始迭代器
- end1 容器1的结束迭代器
- beg2 容器2的开始迭代器
- end2 容器2的结束迭代器
- dest 目标容器开始迭代器
求交集的两个容器必须是有序的。
目标容器开辟的空间需要从两个源容器中取小值。
set_intersction返回值是交集中最后一个元素的位置。
void printV(int val) {
cout << val << " ";
}
void test01() {
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
v2.push_back(i + 5);
}
vector<int> vTarget;
vTarget.resize(min(v1.size(), v2.size()));
vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), itEnd, printV);
cout << endl;
}
2.2、set_union()
set_union()函数:求两个容器元素的并集
函数原型:
set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
参数说明:
- beg1 容器1的开始迭代器
- end1 容器1的结束迭代器
- beg2 容器2的开始迭代器
- end2 容器2的结束迭代器
- dest 目标容器开始迭代器
求并集的两个容器必须是有序的。
目标容器空间大小为两个容器相加。
set_union返回值是并集中最后一个元素的位置。
void printV(int val) {
cout << val << " ";
}
void test01() {
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
v2.push_back(i + 5);
}
vector<int> vTarget;
vTarget.resize(v1.size() + v2.size());
vector<int>::iterator itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), itEnd, printV);
cout << endl;
}
2.3、set_difference()
set_difference()函数:求两个容器元素的差集
函数原型:
set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
参数说明:
- beg1 容器1的开始迭代器
- end1 容器1的结束迭代器
- beg2 容器2的开始迭代器
- end2 容器2的结束迭代器
- dest 目标容器开始迭代器
目标容器包含出现于v1容器但不出现于v2容器的元素。
两个容器必须是有序的。
void printV(int val) {
cout << val << " ";
}
void test01() {
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
v2.push_back(i + 5);
}
vector<int> vTarget;
vTarget.resize(max(v1.size(), v2.size()));
vector<int>::iterator itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), itEnd, printV);
cout << endl;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)