C++STL常用算法合集(下)

一、常用拷贝和替换算法

copy:把指定范围内容器的数据拷贝到另一容器上
replace:更改容器内指定范围的元素
replace_if:更改容器内指定范围且满足条件的元素
swap:交换两容器内的元素

一、copy

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void Print(int val)
{
	cout << val << " ";
}
void test01()
{
	vector<int>v1;
	for (int i = 0; i < 10; i++)
		v1.push_back(i);
	vector<int>v2;
	v2.resize(v1.size());
	copy(v1.begin(), v1.end(), v2.begin());
	for_each(v2.begin(), v2.end(), Print);
	cout << endl;
}

提供一块区间数据的迭代器,和一块存储空间的起点迭代器,将数据拷贝其中,注意实现开辟足够空间

二、replace

void test02()
{
	vector<int>v;
	for (int i = 0; i < 7; i++)
		v.push_back(i);
	v.push_back(3);
	v.push_back(3);
	cout << "替换前:" << endl;
	for_each(v.begin(), v.end(), Print);
	cout << endl;
	replace(v.begin(), v.end(), 3, 7);
	cout << "替换后" << endl;
	for_each(v.begin(), v.end(), Print);
	cout << endl;
}

匹配相同数据进行替换

三、replace_if

class cmp
{
public:
	bool operator()(int val)
	{
		return val > 3;
	}
};
void test03()
{
	vector<int>v;
	for (int i = 0; i < 7; i++)
		v.push_back(i);
	cout << "替换前:" << endl;
	for_each(v.begin(), v.end(), Print);
	cout << endl;
	replace_if(v.begin(), v.end(), cmp(), 666);
	cout << "替换后:" << endl;
	for_each(v.begin(), v.end(), Print);
	cout << endl;
}

条件匹配,使用仿函数,满足条件的将被替换为目的数据

四、swap

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

这是算法库的swap交换函数,通常可以直接调用std:swap()完成交换
结果展示:
在这里插入图片描述

二、常用算数生成算法

accumulate:计算容器元素累计总和
fill:向容器中添加元素

一、accumulate

#include<algorithm>
#include<numeric>
#include<iostream>
#include<vector>
using namespace std;
void Print(int val)
{
	cout << val << " ";
}
void test01()
{
	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 << endl;
}

注意包含头文件<numeric>,作用是求和,最后一个参数可赋初始累加值

二、fill

void test02()
{
	vector<int>v;
	v.resize(10);
	fill(v.begin(), v.end(), 100);
	for_each(v.begin(), v.end(), Print);
	cout << endl;
}

fill填充函数,给区间内的空间都赋上第三个参数的目标值

三、常用集合算法

set_intersection:求两个容器的交集
set_union:求两个容器的并集
set_difference:求两个容器的差集
集合关系
在这里插入图片描述

一、set_intersection

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void Print(int val)
{
	cout <<val<<" " ;
}
void test01()
{
	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 end = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
	for_each(vTarget.begin(), end, Print);
	cout << endl;
}

在这里插入图片描述

交集空间的大小不大于两集合空间的最小值,要预先开辟空间,min是<algorithm>的库函数
set_intersection的返回值即是最后一个交集数据的迭代器,这里不用vTarget.end()
在这里插入图片描述
因为除一集合本身为交集的情况外,空间都会剩余,会打印多余的0,因此用其返回值可避免此问题。此外,求交集的两个集合序列必须有序必须有序

二、set_union

void test02()
{
	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 end=set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
	for_each(vTarget.begin(), end,Print);
	cout << endl;
}

考虑可能没有任何交集的情况,存储并集的容器空间大小应为两集合空间大小的和。以保证空间足够大。
在这里插入图片描述

三、set_difference

A与B的差集为A所具备但B没有的元素,B与A的差集反之即可。

void test03()
{
	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 end = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
	cout << "v1与v2的差集:" << endl;
	for_each(vTarget.begin(), end, Print);
	cout << endl;
	vTarget.clear();
	vTarget.resize(v2.size());
	end = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());
	cout << "v2与v1的差集:" << endl;
	for_each(vTarget.begin(), end, Print);
	cout << endl;
}

开辟空间大小即求差集的第一个集合的空间大小
在这里插入图片描述

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

...404 Not Found

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值