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);
}
//参数3 累加的初值
int total = accumulate(v.begin(), v.end(), 40);
cout << "total=" << total << endl;//total = 初值40 + (1 + 2 + 3 + 4 +... + 10) = 95
}
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);
//用8填充容器
fill(v.begin(), v.end(), 8);
for_each(v.begin(), v.end(), printV);//8 8 8 8 8 8 8 8
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); // 7 7 7 7 7 7 7 7
//把容器中4个元素设置为20
fill_n(v.begin(), 4, 20);
for_each(v.begin(), v.end(), myPrint);// 20 20 20 20 7 7 7 7
}
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);//5 6 7 8 9
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);//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
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()));
//出现于v1但不出现于v2的元素
vector<int>::iterator itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), itEnd, printV);//0 1 2 3 4
cout << endl;
}