C++ 泛型编程:算数生成和集合算法

算数生成算法

  • accumulate // 计算容器元素累积总和,第三个参数为起始值
  • fill // 填充数据

accumulate 案例

// accummulate 案例
void accumulate_example()
{
	vector<int> v;
	for (int i = 0; i <= 100; i++)
	{
		v.push_back(i);
	}

	int total = accumulate(v.begin(), v.end(), 0);
	cout << "total = " << total;
}

fill 案例

// fill 案例
void printVec(int val)
{
	cout << val << " ";
}

void fill_example()
{
	vector<int> v;
	v.resize(10);  // 填充为 0

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

	for_each(v.begin(), v.end(), printVec);
	cout << endl;
}

集合算法

  • set_intersection // 交集,需要提前准备 min( v1.size(), v2.size() ) 的大小
  • set_union // 并集,提前准备 v1.size() + v2.size() 的大小
  • set_difference // 差集,注意顺序,需要提前准备前一个元素 size 的大小
  • 集合算法中两个参与的容器必须都是有序的
  • 集合算法返回的是集合尾部的迭代器(注意,不是,装集合的容器尾部的迭代器)

set_intersection 案例

// set_intersection 案例
void set_intersection_example()
{
	// 必须是有序序列
	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()));
	// 返回的是交集尾部的迭代器
	auto itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());

	// 注意,这里的结束迭代器要用集合尾部的迭代器,因为可能还有多余元素
	for_each(vTarget.begin(), itEnd, printVec);
	cout << endl;
}

set_union 案例

// set_union 案例
void set_union_example()
{
	// 必须是有序序列
	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());
	// 返回的是并集尾部的迭代器
	auto itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());

	// 注意,这里的结束迭代器要用集合尾部的迭代器,因为可能还有多余元素
	for_each(vTarget.begin(), itEnd, printVec);
	cout << endl;
}

set_difference 案例

// set_difference 案例
void set_difference_example()
{
	// 必须是有序序列
	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());
	// 返回的是差集尾部的迭代器
	auto itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());

	// 注意,这里的结束迭代器要用集合尾部的迭代器,因为可能还有多余元素
	for_each(vTarget.begin(), itEnd, printVec);
	cout << endl;
}