C++高级_STL常用算术生成算法和集合算法详解

常用的算术生成算法

accumlate()函数

对指定范围内元素求和,然后再加上一个有 valuelnit 指定的初始值。

需要引用头文件:#include <numeric>

accumulate(begin, end, value_int);

fill()函数

将输入值赋给只等范围元素

fill(begin, end, value);

vector<int> zploo;
zploo.push_back(1);
zploo.push_back(2);
zploo.push_back(3);

fill(zploo.begin(), zploo.end(), 8);
for_each(zploo.begin(), zploo.end(), showInt);
cout<<endl;
//输出结果为: 8 8 8 

算术生成算法练习演示代码:

#include <iostream>
#include <vector>

#include <algorithm>
#include <numeric>
#include <functional>

using namespace std;

void show(int &value)
{
	cout << value << " ";
}
void test_accumualte()
{
	vector<int> vec;

	for (int i = 0; i < 10; i++) {
		vec.push_back(i + 1);
	}

	int sum = accumulate(vec.begin(), vec.end(), 100);

	cout << sum << endl;
}

void test_fill()
{
	vector<int> vec;

	for (int i = 0; i < 10; i++) {
		vec.push_back(i + 1);
	}

	fill(vec.begin(), vec.end(), 0);

	for_each(vec.begin(), vec.end(), show);
	cout << endl;
}

int main(void)
{
	//test_accumualte();
	test_fill();
	
	return 0;
}

常用的集合算法

set_union()函数

构造一个有序序列

包含两个有序序列的并集

set_union(beginA, endA, beginB, endB, beginC);

set_intersection()函数

构造一个有序序列

包含两个有序序列的交集

set_intersection(beginA, endA, beginB, endB beginC);

set_difference()函数

构造一个有序序列

保留第一个序列中存在,第二个序列中不存在的元素(差集)。

set_different(beginA, endA, beginB endB, beginC);

集合算法练习演示代码:

#include <iostream>
#include <algorithm>
#include <numeric>
#include <functional>
#include <vector>
#include <set>

using namespace std;

void show(const int &value)
{
	cout << value << " ";
}

void test_set_union()
{
	//并集
	set<int, less<int>> s1;
	set<int, less<int>> s2;

	for (int i = 0; i < 10; i++) {
		s1.insert(rand() % 10);
		s2.insert(rand() % 20);
	}

	cout << "set1:";
	for_each(s1.begin(), s1.end(), show);
	cout << endl;
	cout << "set2:";
	for_each(s2.begin(), s2.end(), show);
	cout << endl;


	vector<int> vec;

	vec.resize(s1.size() + s2.size());

	//集合算法的返回值 是 目标容器最后一个元素的下一个位置的迭代器
	vector<int>::iterator it = set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), vec.begin());
	vec.resize(it - vec.begin());

	cout << "vec:";
	for_each(vec.begin(), vec.end(), show);
	cout << endl;

}

void test_set_intersection()
{
	//交集
	set<int, less<int>> s1;
	set<int, less<int>> s2;

	for (int i = 0; i < 10; i++) {
		s1.insert(rand() % 10);
		s2.insert(rand() % 20);
	}

	cout << "set1:";
	for_each(s1.begin(), s1.end(), show);
	cout << endl;
	cout << "set2:";
	for_each(s2.begin(), s2.end(), show);
	cout << endl;

	vector<int> vec;

	vec.resize(min(s1.size(), s2.size()));

	vector<int>::iterator it = set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), vec.begin());
	vec.resize(it - vec.begin());


	cout << "vec:";
	for_each(vec.begin(), vec.end(), show);
	cout << endl;
}


void test_set_difference()
{
	//差集 s1 差 s2
	set<int, less<int>> s1;
	set<int, less<int>> s2;


	for (int i = 0; i < 10; i++) {
		s1.insert(rand() % 10);
		s2.insert(rand() % 20);
	}
	cout << "set1:";
	for_each(s1.begin(), s1.end(), show);
	cout << endl;
	cout << "set2:";
	for_each(s2.begin(), s2.end(), show);
	cout << endl;

	vector<int> vec;
	vec.resize(s1.size());
	vector<int>::iterator it = set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), vec.begin());
	vec.resize(it - vec.begin());

	cout << "vec:";
	for_each(vec.begin(), vec.end(), show); 
	cout << endl;
	int cnt = count_if(s1.begin(), s1.end(), bind2nd(less<int>(), 3));

}


int main(void)
{
	//test_set_union();
	//test_set_intersection();
	test_set_difference();
	return 0;
}

 

庄朋龙
庄朋龙

一个爱生活的技术菜鸟

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注