STL-常用算法(二.拷贝 替换 算术 集合)

开篇先附上STL-常用算法(一)的链接

STL-常用算法(一.遍历 查找 排序)_小梁今天敲代码了吗的博客-CSDN博客

目录

常用拷贝和替换算法:

copy函数示例:(将v1容器中的元素复制给v2)

replace函数示例:(将容器中的20 替换成 100)

replace_if函数示例:(将容器中大于等于的30 替换成 300)

swap函数示例:(交换v1和v2容器之间的元素)

常用算术生成算法

accumulate函数示例:(在起始值是100的基础上加上1-10之和)

fill函数示例:(在vector容器中填充10个1)

常用集合算法

set_intersection函数示例:(求0-9的集合和5-14的集合的交集)

set_union函数示例:(求0-9的集合和5-14的集合的并集)

set_difference函数示例:(求0-9的集合和5-14的集合的差集)

 总结:

常用拷贝和替换算法:

copy(iterator beg, iterator end, iterator dest)
// 容器内指定范围的元素拷贝到另一容器中
replace(iterator beg, iterator end, oldvalue, newvalue)
// 将容器内指定范围的旧元素修改为新元素
replace_if(iterator beg, iterator end, _pred, newvalue)           
// 容器内指定范围满足条件的元素替换为新元素
swap(container c1, container c2)                 
// 互换两个容器的元素

copy函数示例:(将v1容器中的元素复制给v2)

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

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

void test01()
{
	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(), myPrint());
	cout << endl;
}

int main() {

	test01();

	system("pause");

	return 0;
}

运行结果:

replace函数示例:(将容器中的20 替换成 100)

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

void test01()
{
	vector<int> v;
	v.push_back(20);
	v.push_back(30);
	v.push_back(20);
	v.push_back(40);
	v.push_back(50);
	v.push_back(10);
	v.push_back(20);

	cout << "替换前:" << endl;
	for_each(v.begin(), v.end(), myPrint());
	cout << endl;

	//将容器中的20 替换成 100
	cout << "替换后:" << endl;
	replace(v.begin(), v.end(), 20, 100);
	for_each(v.begin(), v.end(), myPrint());
	cout << endl;
}

运行结果:

replace_if函数示例:(将容器中大于等于的30 替换成 300)

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

class ReplaceGreater30
{
public:
	bool operator()(int val)
	{
		return val >= 30;
	}

};

void test01()
{
	vector<int> v;
	v.push_back(20);
	v.push_back(30);
	v.push_back(20);
	v.push_back(40);
	v.push_back(50);
	v.push_back(10);
	v.push_back(20);

	cout << "替换前:" << endl;
	for_each(v.begin(), v.end(), myPrint());
	cout << endl;

	//将容器中大于等于的30 替换成 300
	cout << "替换后:" << endl;
	replace_if(v.begin(), v.end(), ReplaceGreater30(), 300);
	for_each(v.begin(), v.end(), myPrint());
	cout << endl;
}

运行结果:

swap函数示例:(交换v1和v2容器之间的元素)

class myPrint
{
public:
	void operator()(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 + 100);
	}

	cout << "交换前: " << endl;
	for_each(v1.begin(), v1.end(), myPrint());
	cout << endl;
	for_each(v2.begin(), v2.end(), myPrint());
	cout << endl;

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

运行结果:

常用算术生成算法

accumulate(iterator beg, iterator end, value)   // 计算容器元素累计总和
fill(iterator beg, iterator end, value)         // 向容器中添加元素

accumulate函数示例:(在起始值是100的基础上加上1-10之和)

void test01()
{
	vector<int> v;
	for (int i = 0; i <= 10; i++) {
		v.push_back(i);
	}

	int total = accumulate(v.begin(), v.end(), 100);//起始值是100

	cout << "total = " << total << endl;
}

运行结果:

fill函数示例:(在vector容器中填充10个1)

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

void test01()
{

	vector<int> v;
	v.resize(10);
	//填充10个1
	fill(v.begin(), v.end(), 1);

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

运行结果:

常用集合算法

set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)        // 求两个容器的交集
set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)                       // 求两个容器的并集
set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)              // 求两个容器的差集

set_intersection函数示例:(求0-9的集合和5-14的集合的交集)

class myPrint
{
public:
	void operator()(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()));

	//返回目标容器的最后一个元素的迭代器地址
	vector<int>::iterator itEnd =
		set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());

	for_each(vTarget.begin(), itEnd, myPrint());
	cout << endl;
}

运行结果:

set_union函数示例:(求0-9的集合和5-14的集合的并集)

class myPrint
{
public:
	void operator()(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(v1.size() + v2.size());

	//返回目标容器的最后一个元素的迭代器地址
	vector<int>::iterator itEnd =
		set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());

	for_each(vTarget.begin(), itEnd, myPrint());
	cout << endl;
}

运行结果:

set_difference函数示例:(求0-9的集合和5-14的集合的差集)

class myPrint
{
public:
	void operator()(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(max(v1.size(), v2.size()));

	//返回目标容器的最后一个元素的迭代器地址
	cout << "v1与v2的差集为: " << endl;
	vector<int>::iterator itEnd =
		set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
	for_each(vTarget.begin(), itEnd, myPrint());
	cout << endl;


	cout << "v2与v1的差集为: " << endl;
	itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());
	for_each(vTarget.begin(), itEnd, myPrint());
	cout << endl;
}

运行结果:

 总结:

        本文总结了STL中剩下的常见算法(拷贝和替换算法,算术生成算法,集合算法)。

所有的 STL 算法归根到底,都可以分为两类。

所谓“质变算法”是指作用在由迭代器[first,last]所标示出来的区间,上运算过程中会更改区间内的元素内容:比如拷贝(copy)、互换(swap)、替换(replace)、填写(fill)、删除(remove)、排列组合(permutation)、分割(partition)。随机重排(random shuffling)、排序(sort)等算法,都属于这一类。

而非质变算法是指在运算过程中不会更改区间内的元素内容。比如查找(find),匹配(search)、计数(count)、遍历(for_each)、比较(equal_mismatch)、寻找极值(max,min)等算法。

使用STL算法的好处如下:

1.易于使用:STL算法提供了一系列的标准库函数,可以对数据结构进行排序,查找,删除,插入等操作。这些函数使用简单方便,用起来非常容易。

2.提高效率:实现算法时,STL的某些算法利用了底层的优化技术,可以帮助开发者提高程序的执行效率。

3.可移植性:STL算法是标准化的,可以在不同的操作系统上使用,使程序具有更好的可移植性。

4.代码复用:STL算法提供了很多函数,可以大大减少代码编写的工作量,提高代码复用率,同时也有助于代码的模块化和可维护性。

5.可扩展性:STL算法提供了一种模板化的方式,使得开发者可以根据需求自定义数据类型和函数。这种方式可以使代码更加灵活和具有扩展性。

总之,STL算法可以使程序更加简洁,高效,可维护,具有更好的可移植性和可扩展性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小梁今天敲代码了吗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值