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

常用算法(下)

一、常用拷贝和替换算法
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;
}
相关推荐
Ivanqhz2 小时前
向量化计算
开发语言·c++·后端·算法·支持向量机·rust
一切尽在,你来2 小时前
C++ 零基础教程 - 第 7 讲 bool运算符和选择结构教程
c++
ffqws_2 小时前
进阶搜索:迭代加深搜索(IDS)埃及分数题解
算法·迭代加深
1104.北光c°2 小时前
【黑马点评项目笔记 | 商户查询缓存篇】基于Redis解决缓存穿透、雪崩、击穿三剑客
java·开发语言·数据库·redis·笔记·spring·缓存
格林威2 小时前
相机的“对焦”和“变焦”,这二者有什么区别?
开发语言·人工智能·数码相机·opencv·算法·计算机视觉·视觉检测
忘忧记2 小时前
用 Python 30 分钟做出自己的记事本
开发语言·python
历程里程碑2 小时前
Linux19 实现shell基本功能
linux·运维·服务器·算法·elasticsearch·搜索引擎·哈希算法
阿萨德528号2 小时前
MyBatis OGNL 表达式陷阱:Integer类型字段使用“xxx!= ‘‘”时判断失效
java·开发语言·mybatis
鲨辣椒100862 小时前
算法也能降低时间复杂度???—————算法延伸
数据结构·算法·排序算法