STL常用算法——算术生成算法和集合算法

32 阅读2分钟

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;
}