STL算法篇之拷贝修改类算法

news2024/9/24 11:30:24

STL算法篇之拷贝修改类算法

  • 拷贝类算法
    • copy与copy_backward
    • remove与remove_copy
    • remove_if与remove_copy_if
  • 修改类算法
    • replace与replace_copy
    • replace_if与replace_copy_if
    • iter_swap与swap与swap_range、
    • unique与unique_copy

拷贝类算法

1.copy 区间拷贝
2.copy_backward 逆向拷贝
3.remove 删除
4.remove_copy 删除另存
5.remove_if 条件删除
6.remove_copy_if 条件删除结果另存

copy与copy_backward

这两个函数的前两个参数,表示被拷贝迭代器的范围,
第三个参数有所区别,
copy的第三个参数是迭代器的初始位置(正向拷贝),
copy_backward的第三个参数是迭代器的末位置(反向拷贝)

意:这里的反向拷贝指的是拷贝的位置反向,不是说将拷贝的数据反向

#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
#include<array>

using namespace std;

int main()
{
	array<int, 4> v1 = { 1, 2, 3,4 };

	vector<int> v2(v1.size()); //copy
 	vector<int> v3(v1.size()); //copy_backward

	copy(v1.begin(), v1.end(), v2.begin());

	
	/*for (auto& v: v2)
	{
		cout << v;
	}*/

	for_each(v2.begin(), v2.end(), [](int& date) {cout << " " << date; });

	cout << endl;
	copy_backward(v1.begin(), v1.end(), v3.end());
	copy(v3.begin(), v3.end(), ostream_iterator<int>(cout, " ")); 
	//copy函数与流型迭代器的结合打印数据

	return 0;
}

容器数据的打印方法有很多
1.可以用auto关键字的范围for循环
2.可以用for_each()算法
3.可以用copy()函数与流型迭代器相结合
4.可以采用迭代器的方式去打印

remove与remove_copy

注意:这remove删除,并不是真正意义上的删除**(如果想真正意义上的删除,再用一个尾删就行**),他只是把删除的数据覆盖,但是容器元素的个数是没有改变的。

remove_copy 将删除的结果另存,倒是可以做到真正意义上的删除

#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
#include<array>

using namespace std;

int main()
{
	vector<int> v1 = { 1, 2, 3 ,4, 5, 6 };
	vector<int> v2(v1.size());

	vector<int> ::iterator it = remove(v1.begin(), v1.end(), 2);
	for_each(v1.begin(), v1.end(), [](int& date) {cout << date << " "; });

	return 0;
}

在这里插入图片描述

#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
#include<array>

using namespace std;

int main()
{
	vector<int> v1 = { 1, 2, 3 ,4, 5, 6 };
	vector<int> v2(v1.size() - 1);

	vector<int> ::iterator it = remove(v1.begin(), v1.end(), 2);
	for_each(v1.begin(), v1.end(), [](int& date) {cout << date << " "; });

	cout << endl;
	auto it1 = remove_copy(v1.begin(), v1.end(), v2.begin(), 3);
	for_each(v2.begin(), v2.end(), [](int& date) {cout << date << " "; });

	return 0;
}

在这里插入图片描述

remove_if与remove_copy_if

#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
#include<array>

using namespace std;

int main()
{
	vector<int> v1 = { 1, 2, 3 ,4, 5, 6 };
	vector<int> v2(v1.size() - 2);

	vector<int> ::iterator it = remove_if(v1.begin(), v1.end(), [](int& date) {return date % 2 == 0; });
	//将所有的偶数覆盖,当然也不是真正意义上的删除,只是单纯的数据覆盖,容器的元素个数不变
	for_each(v1.begin(), v1.end(), [](int& date) {cout << date << " ";});

	cout << endl;
	//真正意义上的删除
	auto it1 = remove_copy_if(v1.begin(), v1.end(), v2.begin(), [](int& date) {return date % 2 == 0; });
	for_each(v2.begin(), v2.end(), [](int& date) {cout << date << " "; });

	return 0;
}

AQ

修改类算法

1.replace 修改
2. replace_copy 修改结果另存
3.replace_if 条件替换
4.replace_copy_if 条件替换,结果另存
5.iter_swap 迭代器交换
6.swap 容器交换
7.swap_range 区间交换
8.unique: 去重操作
unique_copy: 去重结果另存

replace与replace_copy

replace 前两个参数是迭代器范围,第三个参数是容器中要被替换的数据,第四个参数是数据
replace_copy 结果另存,就加了个另存容器的初位置

#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
#include<array>

using namespace std;

int main()
{
	vector<int> v1 = { 1, 2, 3,4, 5, 6 };
	vector<int> v2(v1.size());

	replace(v1.begin(), v1.end(), 1, 99);

	copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	replace_copy(v1.begin(), v1.end(), v2.begin(), 2, 888);
	copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
	
	return 0;
}

replace_if与replace_copy_if

也就是一个条件替换,条件和一个条件替换另存

#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
#include<array>

using namespace std;

int main()
{

	vector<int> v1 = { 1, 2, 3,4, 5, 6 };
	vector<int> v2(v1.size());

	replace_if(v1.begin(), v1.end(), [](int& date) {return date % 2 == 0; }, 99);

	copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));

	cout << endl;

	replace_copy_if(v1.begin(), v1.end(), v2.begin(), [](int& date) {return date % 2 == 0; }, 888);

	copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));


	return 0;

iter_swap与swap与swap_range、

#include<iostream>
#include<vector>
#include<functional>
#include<algorithm>
#include<list>

using namespace std;

int main()
{
	//iter_swap  迭代器的交换  就是将迭代器中元素的位置进行交换
	//注意;在list容器中,如果用 end() -1 会报错
	//这个时候,为了解决这一个问题,可以采用  advance()函数,将元素移动 -1个距离
	//advance的第一个参数是迭代器类型的位置,第二个参数是移动的距离,可以为负数
	list<int> list1 = { 1, 2, 3, 4, 5 };

	list<int> ::iterator it = list1.end();

	advance(it, -1);
	iter_swap(list1.begin(), it);

	copy(list1.begin(), list1.end(), ostream_iterator<int>(cout, " "));
	
	cout << endl;
	// swap 迭代器交换
	//参数为2个容器的对象

	list<int> list2 = { 99, 99, 2 };
	cout << "交换前 :";
	copy(list1.begin(), list1.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	copy(list2.begin(), list2.end(), ostream_iterator<int>(cout, " "));

	cout << endl;
	swap(list1, list2);
	cout << "交换后 :";
	copy(list1.begin(), list1.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	copy(list2.begin(), list2.end(), ostream_iterator<int>(cout, " "));

	//swap_ranges  区间交换
	cout << endl;

	vector<int> v1 = { 1,23, 4, 5 };
	vector<int> v2 = { 9, 8 , 7, 6, 5, 4, 3, 2, 1 };
	swap_ranges(v1.begin(), v1.begin() + 2, v2.begin());

	for (auto& v : v1)
	{
		cout << v << " ";
	}
	cout << endl;

	for (auto& v : v2)
	{
		cout << v << " ";
	}
	return 0;
}

unique与unique_copy

#include<iostream>
#include<vector>
#include<functional>
#include<algorithm>
#include<list>

using namespace std;

int main()
{
	// unique 去重
	// 注意:这个函数去重,感觉其实挺鸡肋的,因为它不能够将所有元素去重,只能够实现部分去重
	

	vector<int> v1 = { 1, 1, 3,4 ,4, 4, 4, 4, 4,5 ,5 ,6 ,6 ,7, 8, 8 };
	unique(v1.begin(), v1.end());

	for (auto& v : v1)
	{
		cout << v << " ";
	}
	
	//unique_copy
	//unique_copy倒是可以实现所有元素去重
	//不过去重的元素必须是要有序的,不然就会报错

	vector<int> v2 = { 1, 1, 3,4 ,4, 4, 4, 4, 4,5 ,5 ,6 ,6 ,7, 8, 8 };
	vector<int> v3(v2.size());
	
	cout << endl;
	unique_copy(v2.begin(), v2.end(), v3.begin());

	for (auto& v : v3)
	{
		cout << v << " ";
	}

	return -0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/758440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis双写一致性?

双写一致性&#xff1a;当修改了数据库的数据也要同时更新缓存的数据&#xff0c;缓存和数据库的数据要保持一致。 Redis作为缓存&#xff0c;mysql的数据如何与redis进行同步呢&#xff1f;&#xff08;双写一致性&#xff09; 1.我们当时做排行榜业务时&#xff0c;把历史榜…

CentOS7中安装docker并配置阿里云加速器

文章目录 一、docker的安装二、docker的卸载三、配置加速器四、docker-compose安装五、docker-compose卸载六、docker-compose相关命令七、常用shell组合 一、docker的安装 参考&#xff1a;https://docs.docker.com/engine/install/centos 本文内容是基于&#xff1a;CentOS L…

Python 算法基础篇:大O符号表示法和常见时间复杂度分析

Python 算法基础篇&#xff1a;大 O 符号表示法和常见时间复杂度分析 引言 1. 大 O 符号表示法 a ) 大 O 符号的定义 b ) 示例代码 2. 常见时间复杂度分析总结 引言 在分析和比较算法的性能时&#xff0c;时间复杂度是一项重要的指标。而大 O 符号表示法是用来描述算法时间复杂…

Redis 从入门到精通【进阶篇】之Lua脚本详解

文章目录 0. 前言1. Redis Lua脚本简介1.1 Lua脚本介绍Lua语言概述&#xff1a;Lua脚本的特点&#xff1a; 1.2 Redis中为何选择LuaLua与Redis的结合优势Lua脚本在Redis中的应用场景 2. Redis Lua脚本的执行流程1. 加载脚本&#xff1a;1.1 脚本缓存机制&#xff1a;1.2 脚本加…

C++ 可变参数函数用法与template模板泛型编程

目录 1、可变参数函数 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;常用使用场景 2、template模板用法 1、可变参数函数 &#xff08;1&#xff09;定义 可变参数函数的可变参数一般使用省略号表示&#xff0c;如下&#xff1a; void func(int a,...);{} &…

牛P!安卓渗透神器PhoneSploit-Pro

工具介绍 一种集成的黑客工具&#xff0c;可使用ADB(Android Debug Bridge) 和Metasploit-Framework完成自动化&#xff0c;一键获取 Meterpreter 会话。 关注【Hack分享吧】公众号&#xff0c;回复关键字【230524】获取下载链接 如果设备打开了 ADB 端口&#xff0c;该工具可…

关于Context和ContextImpl还有ContextWrapper的关系

关于Context和ContextImpl还有ContextWrapper的关系 1.Context和ContextImpl还有ContextWrapper的关系 ​ 图一.Context和ContextImpl还有ContextWrapper的关系示意图 1.1.ContextImpl是Context的实现类 从Context和ContextImpl的源代码中,可以看出Context是一个抽象类,具体…

pytorch+CRNN实现

最近接触了一个仪表盘识别的项目&#xff0c;简单调研以后发现可以用CRNN来做。但是手边缺少仪表盘数据集&#xff0c;就先用ICDAR2013试了一下。 结果遇到了一系列坑。为了不使读者和自己在以后的日子继续遭罪。我把正确的代码发到下面了。 1&#xff09;超参数请不要调整&am…

实体店搭建多用户商城系统有什么好处

现在很多的线下店铺都开始慢慢的转型线上了&#xff0c;想线上线下相结合&#xff0c;但是最近很多的商家都在问什么样的B2B2C商城系统开发适合线下店铺呢?这个问题今天加速度jsudo小编给大家一起整理如下&#xff0c;相信商家看完后就知道如何选择一款合适的商城系统了。 一、…

Spring Batch之读数据—读XML文件(三十二)

一、XML格式文件解析 XML是一种通用的数据交换格式&#xff0c;它的平台无关性、语言无关性、系统无关性&#xff0c;给数据集成与交换带来了极大的方便。XML在Java领域的解析方式有两种&#xff0c;一种叫SAX&#xff0c;另一种叫DOM。SAX是基于事件流的解析&#xff0c;DOM是…

刷题总结1

暑假第二周练习题 - Virtual Judge (vjudge.net) 该题就是将含4的数字全部跳过&#xff0c;不难发现&#xff0c;这就导致每位数都要少一个树&#xff0c;这就和9进制十分像&#xff0c;我们只要将该数字转化为9进制&#xff0c;然后将该9进制树的每位大于等于4的树加一就行了&…

【CXL】CXL QoS Telemetry 介绍

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

51单片机的智能交通控制系统【含仿真+程序+演示视频带原理讲解】

51单片机的智能交通控制系统【含仿真程序演示视频带原理讲解】 1、系统概述2、核心功能3、仿真运行及功能演示4、程序代码 1、系统概述 该系统由AT89C51单片机、LED灯组、数码管组成。通过Protues对十字路口红绿灯控制逻辑进行了仿真。 每个路口包含了左转、右转、直行三条车道…

rapid_latex_ocr: 更快更好用的公式图像转latex工具

Rapid Latex OCR rapid_latex_ocr是一个将公式图像转为latex格式的工具。仓库中的推理代码来自修改自LaTeX-OCR&#xff0c;模型已经全部转为ONNX格式&#xff0c;并对推理代码做了精简&#xff0c;推理速度更快&#xff0c;更容易部署。仓库只有基于ONNXRuntime或者OpenVINO推…

AI辅助瞄准系统开发与实战(一)

文章目录 前言系统窗体设计提示弹窗功能主体页面 windows窗体绘制矩形绘制自定义线程池完整代码 总结 前言 直接看效果&#xff0c;狗头&#xff1a; 之所以搞这个的话&#xff0c;当然主要一方面是因为确实有点意思在里面&#xff0c;此外在很久以前&#xff0c;也有很多的UP…

光伏并网逆变器低电压穿越MATLAB仿真模型

使用MATLAB 2017b搭建 光伏逆变器低电压穿越仿真模型&#xff0c;boost加NPC拓扑结构&#xff0c;基于MATLAB/Simulink建模仿真。具备中点平衡SVPWM控制&#xff0c;正负序分离控制&#xff0c;pll&#xff0c;可进行低电压穿越仿真。 控制结构完整&#xff0c;波形完美&…

Web入门-HTTP协议

目录 HTTP概述 HTTP特点 HTTP请求协议 请求数据的格式 响应数据的格式 响应的状态码 HTTP协议的解析 HTTP概述 HTTP:Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定浏览器和服务器之间数据传输的规则。(即请求数据和响应数据的格式)以上一篇…

动态规划之119杨辉三角 II(第7道)

题目&#xff1a;给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 题目链接&#xff1a;119. 杨辉三角 II - 力扣&#xff08;LeetCode&#xff09; 示例&#xff1a; 解法&…

高阶C语言|字符函数和字符串函数--函数的模拟实现

C语言中对字符和字符串的处理很是频繁&#xff0c;但是C语言本身是没有字符串类型的&#xff0c;字符串通常放在常量字符串中或者字符数组中。字符串常量适用于那些对它不做修改的字符串函数 字符函数和字符串函数 一、求字符串长度1.1strlen的使用1.2strlen函数的模拟实现 二…

基于linux下的高并发服务器开发(第一章)- 模拟实现 ls-l 命令

这一小节会用到上面两张图的红色框里面的变量 任务&#xff1a; 模拟实现 ls -l 指令 -rw-rw-r-- 1 nowcoder nowcoder 12 12月 3 15:48 a.txt #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <p…