C++:STL:常用算法(下):拷贝,算术,集合算法

一:常用拷贝和替换算法

学习目标:掌握常用的拷贝和替换算法

算法简介:

copy     // 容器内指定范围的元素拷贝到另一容器中

replace   // 将容器内指定范围的旧元素修改为新元素

replace_if     // 容器内指定范围满足条件的元素替换为新元素

swap   // 互换两个容器的元素

1.1 copy算法 

功能描述:容器内指定范围的元素拷贝到另一个容器中

函数原型:copy(iterator beg, iterator end, iterator dest)

按值查找,找到返回指定位置的迭代器,找不到返回结束位置的迭代器

beg:  开始迭代器

end:  结束迭代器

dest:  目标起始迭代器

#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;

class MyPrints
{
public:
	void operator()(int val) {
		cout << val << " ";
	}
};

void test() {
	vector<int> v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i + 1);
	}

	vector<int> v2;
	v2.resize(v1.size());
	copy(v1.begin(), v1.end(), v2.begin());

	for_each(v2.begin(), v2.end(), MyPrints());
	cout << endl;
}

int main() {
	test();
}

1.2:replace 算法 

功能描述:将容器内指定范围的旧元素修改为新元素

函数原型:replace(iterator beg, iterator end ,oldvalue, newvalue)

将区间内旧元素替换成新元素

beg:  开始迭代器

end: 结束迭代器

oldvalue : 旧元素

newvalue :  新元素

void test1() {
	vector<int> v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	for_each(v1.begin(), v1.end(), MyPrints());
	cout << endl;
	replace(v1.begin(), v1.end(), 20, 200);
	for_each(v1.begin(), v1.end(), MyPrints());
}

1.3:replace_if 

功能描述:将区间内满足条件的元素,替换成指定元素

函数原型: replace_if (iterator beg,  iterator end, _pred, newvalue)

按条件替换元素,满足条件的替换成指定元素

beg:   开始迭代器

end :  结束迭代器

_pred :  谓词

newvalue :  替换的新元素

void test2() {
	vector<int> v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);

	// 把大于20的数替换成 1000
	for_each(v1.begin(), v1.end(), MyPrints());
	cout << endl;
	replace_if(v1.begin(), v1.end(), Greater30(), 1000);
	for_each(v1.begin(), v1.end(), MyPrints());
}

1.4:swap算法 

功能描述: 互换两个容器的元素

函数原型: swap(container c1, container c2);

互换两个容器的元素

c1:  容器1

c2:  容器2

void test3() {
	vector<int> v1;
	vector<int> v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 10);
	}
	cout << "交换前:" << endl;
	for_each(v1.begin(), v1.end(), MyPrints());
	cout << endl;
	for_each(v2.begin(), v2.end(), MyPrints());

	cout << "交换后:" << endl;
	swap(v1, v2);
	for_each(v1.begin(), v1.end(), MyPrints());
	cout << endl;
	for_each(v2.begin(), v2.end(), MyPrints());
	cout << endl;
}

二:常用算术生成算法 

学习目标:掌握常用的算术生成算法

注意: 算术生成算法属于小型算法,使用时包含的头文件:#include <numeric>

算法简介:

accumulate  // 计算容器元素累计总和

fill    // 向容器中添加元素

void test4() {
	vector<int> v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	int a = accumulate(v1.begin(), v1.end(), 0);
	int b = accumulate(v1.begin(), v1.end(), 100);

	cout << a << " ";
	cout << b << endl;
}

2.2:fill 

功能描述:向容器中填充指定的元素

函数原型:fill (iterator beg,  iterator end , value);

向容器中填充元素

beg: 开始迭代器

end: 结束迭代器

value: 填充的值

void test5() {
	vector<int> v1;
	v1.resize(10);
	
	// 填充
	fill(v1.begin(), v1.end(), 100);
	for_each(v1.begin(), v1.end(), MyPrints());
	cout << endl;
}

三:常用集合算法 

学习:掌握常用的集合算法

算法简介

set_intersection    // 求两个容器的交集

set_union   // 求两个容器的∪

set_difference  // 求两个容器的差集

3.1 :set_intersection 

功能描述:求两个容器的交集

函数原型:set_intersection(iterator beg1,iterator end1, iterator beg2, iterator end2, iterator dest)

求两个集合的交集,注意:两个集合必须是有序序列

beg1 :  容器1开始迭代器

end1:   容器1结束迭代器

beg2:  容器2 开始迭代器

end2:   容器2 结束迭代器

dest:   目标容器开始迭代器

void test6() {
	vector<int> v1;
	vector<int> v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 10);
	}
	cout << "求集合交集前:" << endl;
	for_each(v1.begin(), v1.end(), MyPrints());
	cout << endl;
	for_each(v2.begin(), v2.end(), MyPrints());
	cout << endl;

	cout << "求交集后:" << endl;
	vector<int> v3;
	// 容器大小为这两个容器中最小的一个
	v3.resize(min(v1.size(), v2.size()));
	vector<int>::iterator end = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	cout << endl;
}
void myPrint(int val)
{
	cout << val << " ";
}

void test6() {
	vector<int> v1;
	vector<int> v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 5);
	}
	cout << "求集合交集前:" << endl;
	for_each(v1.begin(), v1.end(), MyPrints());
	cout << endl;
	for_each(v2.begin(), v2.end(), MyPrints());
	cout << endl;

	cout << "求交集后:" << endl;
	vector<int> v3;
	// 容器大小为这两个容器中最小的一个
	v3.resize(min(v1.size(), v2.size()));
	vector<int>::iterator end = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	for_each(v3.begin(), end, myPrint);
	cout << endl;
}

3.2 :set_union

功能描述:求两个集合的并集

函数原型:set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)

求两个集合的∪,注意两个集合必须是有序序列

beg1:  容器1开始迭代器

end1:  容器1结束迭代器

void test7() {
	vector<int> v1;
	vector<int> v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 5);
	}
	cout << "求集合并集前:" << endl;
	for_each(v1.begin(), v1.end(), myPrint);
	cout << endl;
	for_each(v2.begin(), v2.end(), myPrint);
	cout << endl;

	cout << "求并集后:" << endl;
	vector<int> v3;
	// 容器大小为这两个容器大小之和
	v3.resize(v1.size()+ v2.size());
	vector<int>::iterator end = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	for_each(v3.begin(), end, myPrint);
	cout << endl;
}

3.3 : set_difference 

功能描述: 求两个集合的差集

函数原型: set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)

求两个集合的差集,注意:两个集合必须是有序序列

beg1 :  容器1开始迭代器

end1:  容器1结束迭代器

beg2:   容器2开始迭代器

end2:   容器2结束迭代器

dest:   目标容器开始迭代器

在这里插入图片描述

void test8() {
	vector<int> v1;
	vector<int> v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 5);
	}
	cout << "求集合差集前:" << endl;
	for_each(v1.begin(), v1.end(), myPrint);
	cout << endl;
	for_each(v2.begin(), v2.end(), myPrint);
	cout << endl;

	cout << "求差集后:" << endl;
	vector<int> v3;
	// 容器大小为这两个容器大小之和
	v3.resize(max(v1.size(),v2.size()));

	// V1和V2差集
	vector<int>::iterator end = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	for_each(v3.begin(), end, myPrint);
	cout << endl;

	// V2和V1差集
	end = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), v3.begin());
	for_each(v3.begin(), end, myPrint);
	cout << endl;
}

猜你喜欢

转载自blog.csdn.net/u013620306/article/details/128546043