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;
}

运行结果:

相关推荐
写一本我们家的书28 分钟前
Qt MainWindow简单例子(文本编辑)
开发语言·qt
ん贤1 小时前
【数据结构】栈与队列:基础 + 竞赛高频算法实操(含代码实现)
java·数据结构·c++·算法
JCBP_1 小时前
C语言经典代码题
c语言·开发语言·汇编·vscode·算法
萧萧玉树1 小时前
设计模式-单一职责
开发语言·c++·设计模式
java1234_小锋1 小时前
一周学会Flask3 Python Web开发-SQLAlchemy添加数据操作-班级模块
开发语言·前端·python·flask·flask3
forestsea1 小时前
Java 8 Stream API:传统实现和流式编程的范式对比
java·开发语言
多多*1 小时前
Spring设计模式 八股速记 高层模块底层模块 依赖倒置原则 开闭原则 接口隔离原则
java·开发语言·数据库·macos·github·objective-c·cocoa
小林熬夜学编程1 小时前
【高并发内存池】第一弹---深入解析内存池:项目介绍、原理及设计定长内存池全攻略
linux·服务器·c语言·开发语言·c++·算法
郭涤生2 小时前
Chapter 2:auto_《Effective Modern C++》notes
开发语言·c++·笔记
沙滩捡贝壳的小男孩2 小时前
告别硬编码:优雅管理状态常量与响应码
java·开发语言