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

运行结果:

相关推荐
树叶@11 分钟前
Python数据分析7
开发语言·python
wydaicls14 分钟前
十一.C++ 类 -- 面向对象思想
开发语言·c++
Biomamba生信基地1 小时前
R语言基础| 下载、安装
开发语言·r语言·生信·医药
姜君竹1 小时前
QT的工程文件.pro文件
开发语言·c++·qt·系统架构
思捻如枫1 小时前
C++数据结构和算法代码模板总结——算法部分
数据结构·c++
奇树谦1 小时前
使用VTK还是OpenGL集成到qt程序里哪个好?
开发语言·qt
嘉陵妹妹1 小时前
深度优先算法学习
学习·算法·深度优先
VBA63371 小时前
VBA之Word应用第三章第十节:文档Document对象的方法(三)
开发语言
老胖闲聊1 小时前
Python Rio 【图像处理】库简介
开发语言·图像处理·python
GalaxyPokemon1 小时前
LeetCode - 53. 最大子数组和
算法·leetcode·职场和发展