常用算法(下)---拷贝、替换、算术生成、集合算法

常用算法(下)

一、常用拷贝和替换算法
1.copy

容器内指定范围内的元素拷贝到另一容器中。函数原型:

c++ 复制代码
copy(iterator beg,iterator end,iterator dest);

使用示例:

c++ 复制代码
void print01(int val)
{
	cout << val << " ";
}
//copy
void test01()
{
	vector<int>v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}

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

	//copy复制
	vector<int>v2;
	v2.resize(v.size());//复制时,空容器一定要预先指定大小

	copy(v.begin(), v.end(), v2.begin());
	for_each(v2.begin(), v2.end(), print01);
	cout << endl;
}

空容器一定要提前开辟空间

2.replace

将指定范围内的旧元素修改为新元素 。函数原型:replace(iterator beg,iterator end,old value,newvalue);

c++ 复制代码
void test02()
{
	vector<int>v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	cout << "befor replace:" << endl;
	for_each(v.begin(), v.end(), print01);
	cout << endl;

	//替换
	cout << "after replace: " << endl;
	replace(v.begin(), v.end(), 0, 10);
	for_each(v.begin(), v.end(), print01);
	cout << endl;
}
3.replace_if

将区间内满足条件的元素 ,替换成指定元素。函数原型:replace_if(iterator beg,iterator end,_pred,newvalue);

c++ 复制代码
class myPlace
{
public:
	bool operator()(int val)
	{
		return val < 7;//我的条件,小于7的都满足我需要替换的条件
	}
};
void test03()
{
	vector<int>v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}

	cout << "替换前:" << endl;
	for_each(v.begin(), v.end(), print02());// 0 1 2 3 4 5 6 7 8 9
	cout << endl;

	//替换
	cout << "替换后:" << endl;
	replace_if(v.begin(), v.end(), myPlace(), 7);//所有满足myPlace条件的都将替换成7
	for_each(v.begin(), v.end(), print02());// 7 7 7 7 7 7 7 7 8 9
	cout << endl;
}

_Pred是谓词,也是我们需要写的替换条件

4.swap

互换两个容器中的元素 。函数原型:swap(container c1,container c2);

c++ 复制代码
void test04()
{
	vector<int>v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	vector<int>v2;
	for (int i = 100; i < 110; i++)
	{
		v2.push_back(i);
	}
	cout << "before swap:" << endl;
	for_each(v.begin(), v.end(), print01);
	cout << endl;
	for_each(v2.begin(), v2.end(), print02());
	cout << endl;

	//交换
	cout << "after swap:" << endl;
	swap(v, v2);
	for_each(v.begin(), v.end(), print01);
	cout << endl;
	for_each(v2.begin(), v2.end(), print02());
	cout << endl;
}

两个容器必须是同一种类型,不需要留空间,二者大小直接交换

二、常用算术生成算法

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

1.accumulate

计算区间内容器元素累计总和accumulate(iterator beg,iterator end,value);value为起始叠加值,即从什么开始累加

c++ 复制代码
void test05()
{
	vector<int>v;
	int sum = 0;
	for (int i = 0; i <= 10; i++)
	{
		v.push_back(i);
		sum += i;
	}
	int sum1 = accumulate(v.begin(), v.end(), 0);
	cout << sum << endl;//55
	cout << sum1 << endl;//55
}

应用:评委打分,累加分数,若value为0,则从0开始加,若value为100,则从100开始加,即容器内部元素总和加value为最终输出的值。

2.fill

向容器中填充指定的元素 。函数原型:fiil(iterator beg,iterator end,value);value为填充的值

c++ 复制代码
void test06()
{
	vector<int>v;
	v.resize(7);//指定容器大小,默认为0;现在是7个0
	for_each(v.begin(), v.end(), print01);//0 0 0 0 0 0 0
	cout << endl;

	//后期重新填充
	fill(v.begin(), v.end(), 6);
	for_each(v.begin(), v.end(), print01);//6 6 6 6 6 6 6
	cout << endl;
}
三、常用集合算法
1.set_intersection

求解两个容器的交集set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);求解两个容器的交集,并将交集放在目标容器中dest

c++ 复制代码
void test07()
{
	vector<int>v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}

	vector<int>v2;
	for (int i = 5; i < 18; i++)
	{
		v2.push_back(i);
	}

	vector<int>v3;
	v3.resize(min(v1.size(),v2.size()));
	//交集最好的情况就是其中一个容器是完全包含在另一个容器中的,所以最大的交集个数为二者大小最小的

	//获取交集
	vector<int>::iterator pos = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	//元素个数没有容器容量大的话,会以默认值0填充,所以我们会使用它返回的结束迭代器
	for_each(v3.begin(), pos, print01);
	cout << endl;
}

函数的返回值是一个迭代器,是求解的交集中的最后一个元素的位置。遍历时,就使用这个迭代器,两个源容器需要是有序的序列才可以

2.set_union

求两个集合的并集set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);两个集合必须是有序序列

c++ 复制代码
void test08()
{
	vector<int>v1;
	for (int i = 0; i < 12; i++)
	{
		v1.push_back(i);
	}
	vector<int>v2;
	for (int i = 6; i < 17; i++)
	{
		v2.push_back(i);
	}

	vector<int>v3;
	v3.resize(v1.size()+v2.size());//最坏情况下,是两个容器内的元素都不相同,所以最大的是两个容器的大小和

	vector<int>::iterator pos = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	for_each(v3.begin(), pos, print01);//遍历结束在返回的容器结束迭代器位置,否则会以0补充
	cout << endl;
}

返回的结果是一个迭代器 ,是求解的并集中的最后一个元素的位置

3.set_difference

求两个集合的差集set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);两个集合必须是有序的序列。求解两个容器的差集,第一个容器和第二个容器的差集是指第一个容器中没有出现在第二个容器中的元素

c++ 复制代码
void test09()
{
	vector<int>v1;
	for (int i = 0; i < 13; i++)
	{
		v1.push_back(i);
	}
	vector<int>v2;
	for (int i = 7; i < 18; i++)
	{
		v2.push_back(i);
	}
	for_each(v1.begin(), v1.end(), print01);//0 1 2 3 4 5 6 7 8 9 10 11  12 
	cout << endl;
	for_each(v2.begin(), v2.end(), print01);//7 8 9 10 11 12 13 14 15 16 17
	cout << endl;

	//求差集
	cout << "v1和v2的差集:" << endl;
	vector<int>v3;
	v3.resize(max(v1.size(),v2.size()));
	vector<int>::iterator pos = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	for_each(v3.begin(), pos, print01);//0 1 2 3 4 5 6
	cout << endl;
}
相关推荐
寄存器漫游者1 小时前
Linux 线程间通信
数据库·算法
岛雨QA1 小时前
查找算法「Java数据结构与算法学习笔记7」
数据结构·算法
宝贝儿好2 小时前
【强化学习】第十章:连续动作空间强化学习:随机高斯策略、DPG算法
人工智能·python·深度学习·算法·机器人
isyoungboy2 小时前
从图像中提取亚像素边缘点
算法
Ljwuhe2 小时前
类与对象(中)——运算符重载
开发语言·c++
郝学胜-神的一滴2 小时前
深入理解链表:从基础到实践
开发语言·数据结构·c++·算法·链表·架构
敲敲了个代码2 小时前
vue文件自动生成路由会成为主流
开发语言·前端·javascript·vue.js·前端框架
你住过的屋檐2 小时前
【Java】虚拟线程详解
java·开发语言
霍理迪2 小时前
JS—事件高级
开发语言·javascript·ecmascript
岛雨QA2 小时前
排序算法「Java数据结构与算法学习笔记6」
数据结构·算法