C++ STL 之常用拷贝和替换算法①copy();②replace();③replace_if();④swap();

VS2017 程序下载:https://pan.baidu.com/s/1ZTFWrl4rG8Z1PxL7vzrOdw?pwd=i7pt

目录

1.copy

2.replace

3.replace_if

4.swap


1.copy

功能描述:

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

函数原型:

cpp 复制代码
// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
// beg 开始迭代器 end 结束迭代器 dest 目标起始迭代器
copy(iterator beg, iterator end, iterator dest); 

程序:

cpp 复制代码
#include<iostream>
using namespace std;
#include <vector>
#include <algorithm>

//普通函数打印数据
void myPrint(int val)
{
	cout << val << " ";
}

//仿函数 打印数据
class print02
{
public:
	void operator()(int val)//重载()
	{
		cout << val << " ";
	}
};

void printVector(vector<int>&v)//遍历打印
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << " ---print end--- " << endl;
}
void test01()
{
	vector<int>v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);//尾插数据 0~9
	}
	cout << " v1 数据: ";
	printVector(v1);

	vector<int>v2;
	v2.resize(v1.size());//开辟空间

	//将v1所有元素拷贝到v2
	copy(v1.begin(), v1.end(), v2.begin());
	cout <<  " 调用普通函数遍历,打印v2数据: ";
	//遍历元素,并打印
	for_each(v2.begin(), v2.end(), myPrint);
	cout << endl;

	cout << " 调用仿函数遍历,打印v2数据: ";
	for_each(v2.begin(), v2.end(), print02());
	cout << endl;
}

int main() {

	test01();
	system("pause");
	return 0;
}

运行结果:

2.replace

功能描述:

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

函数原型:

cpp 复制代码
// 将区间内旧元素 替换成 新元素
// beg 开始迭代器 end 结束迭代器 oldvalue 旧元素 newvalue 新元素
replace(iterator beg, iterator end, oldvalue, newvalue); 

程序:

cpp 复制代码
#include<iostream>
using namespace std;
#include <vector>
#include<algorithm>

//普通函数打印数据
void myPrint(int val)
{
	cout << val << " ";
}

//仿函数 打印数据
class print02
{
public:
	void operator()(int val)//重载()
	{
		cout << val << " ";
	}
};

void printVector(vector<int>&v)//遍历打印
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << " ---print end--- " << endl;
}

void test01()
{

	vector<int>v;
	v.push_back(20);
	v.push_back(30);
	v.push_back(50);
	v.push_back(30);
	v.push_back(40);
	v.push_back(20);
	v.push_back(10);
	v.push_back(20);
	cout << " v 数据: ";
	printVector(v);

	cout << " 调用普通函数遍历打印 替换前 v数据: ";
	for_each(v.begin(), v.end(), myPrint);
	cout << endl;

	//将20 替换 88
	replace(v.begin(), v.end(), 20, 88);
	cout << " 调用 仿函数遍历打印 替换后 v 数据: ";
	for_each(v.begin(), v.end(), print02());
	cout << endl;
}

int main() {

	test01();
	system("pause");
	return 0;
}

运行结果:

3.replace_if

功能描述:

将区间内满足条件的元素,替换成指定元素

函数原型:

cpp 复制代码
// 按条件替换元素,满足条件的替换成指定元素
// beg 开始迭代器, end 结束迭代器, _pred 谓词, newvalue 替换的新元素
replace_if(iterator beg, iterator end, _pred, newvalue); 

程序:

cpp 复制代码
#include<iostream>
using namespace std;
#include <vector>
#include <algorithm>

//普通函数打印数据
void myPrint(int val)
{
	cout << val << " ";
}

//仿函数 打印数据
class MyPrint
{
public:
	void operator()(int val)//重载()
	{	
		cout << val << " ";
	}
};

class Greater30
{
public:
	bool operator()(int val)//判断数据是否 ≥30
	{
		return val >= 30;
	}
};

void printVector(vector<int>&v)//遍历打印
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << " ---print end--- " << endl;
}

//常用拷贝和替换算法 replace_if
void test01()
{
	vector<int>v;
	v.push_back(10);
	v.push_back(40);
	v.push_back(20);
	v.push_back(40);
	v.push_back(30);
	v.push_back(50);
	v.push_back(20);
	v.push_back(30);
	cout << " v 数据: ";
	printVector(v);

	cout << "替换前: " << endl;
	cout << " 调用普通函数遍历打印 替换前 v数据: ";
	for_each(v.begin(), v.end(), myPrint);
	cout << endl;

	//将大于等于30的数 全部 替换为 88
	replace_if(v.begin(), v.end(), Greater30(),88);
	cout << "替换后: " << endl;
	cout << " 调用 仿函数遍历打印 替换前 v 数据: ";
	for_each(v.begin(), v.end(), MyPrint());
	cout << endl;
}

int main() {

	test01();
	system("pause");
	return 0;
}

运行结果:

4.swap

功能描述:

互换两个容器的元素

函数原型:

cpp 复制代码
// 互换两个容器的元素
// c1:容器1, c2:容器2
swap(container c1, container c2); 

程序:

cpp 复制代码
#include<iostream>
using namespace std;
#include <vector>
#include <algorithm>

//普通函数 打印数据
void myPrint(int val)
{
	cout << val << " ";
}

//仿函数 打印数据
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+10);
	}

	cout << "交换前 v1: " << endl;
	//遍历 打印数据
	for_each(v1.begin(), v1.end(), myPrint);
	cout << endl;
	cout << "交换前 v2: " << endl;
	for_each(v2.begin(), v2.end(), MyPrint());
	cout << endl;

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

int main() {

	test01();
	system("pause");
	return 0;
}

运行结果:

相关推荐
quantdash_cc2 分钟前
如何设计高效率的批量股票数据获取程序?QuantDash Python SDK 全市场行情拉取实战指南
开发语言·python·数据分析·量化交易·股票数据·quantdash
Jul1en_7 分钟前
Matt 与 Uncle Bob 的播客访谈有感
开发语言·经验分享·笔记·ai·开源·github·ai编程
玖玥拾12 分钟前
Lua 基础语法(五)Unity xLua基础配置与 C# 访问 Lua
开发语言·unity·c#·lua
淼澄研学16 分钟前
Sonos空间音频技术解析与Python本地API控制实操
开发语言·python·音视频
研☆香22 分钟前
js中使用的正则表达式
开发语言·javascript·正则表达式
szarron22 分钟前
国产手持式频谱分析仪选型攻略:TFN RC系列 vs HTOOL SA8T频谱分析仪 专业参数对比(军工/路测/调试全覆盖)
开发语言·前端·状态模式
我是唐青枫23 分钟前
C#.NET StructureMap 从依赖注入到项目实战
开发语言·c#·.net
Beyond_System|系统之外27 分钟前
一个网页如何同时适配投影仪、1366×768 和 1920×1080?我重新理解了“自适应布局”
开发语言·css·html
蛋先生DX27 分钟前
内存安全翻车现场的罪魁祸首,根源就在这三步里?
c++·后端·编程语言
小七在进步34 分钟前
C++入门(1)
java·jvm·c++