C++之STL的algorithm(4)之拷贝相关算法(copy、replace、swap)整理

C++之STL的algorithm(4)之拷贝相关算法(copy、replace、swap)整理

注:整理一些突然学到的C++知识,随时mark一下
例如:忘记的关键字用法,新关键字,新数据结构


C++ 的查找算法整理

  • C++之STL的algorithm(4)之拷贝相关算法(copy、replace、swap)整理
  • 一、拷贝替换算法
    • 1、 copy 算法
    • 2、replace 算法
    • 3、 replace_if 算法
  • 二、交换算法
    • 1、swap 算法
    • 2、map如何实现 swap
  • 总结


提示:本文为 C++ 中copy、replace、swap 的写法和举例


一、拷贝替换算法

  详细解释<algorithm>头文件中各个查找算法的参数列表和返回值,然后给出使用vector、map、set的例子。需要注意的是,并非所有的STL算法都适用于上述所有类型的容器,如map和set是基于关联的数据结构,而vector则是基于序列的数据结构。

1、 copy 算法

参数:

beg:源范围起始迭代器。
end:源范围结束迭代器。
dest:目标容器起始迭代器。
返回值:

返回目标容器中最后一个拷贝元素之后的位置的迭代器。

例子:

#include <iostream>  
#include <vector>  
#include <algorithm>  int main() {  std::vector<int> source = {1, 2, 3, 4, 5};  std::vector<int> destination(5); // 预先分配空间  // 使用copy算法将source的元素拷贝到destination  std::copy(source.begin(), source.end(), destination.begin());  // 输出destination  for (int i : destination) {  std::cout << i << ' ';  }  return 0;  
}

对于map和set,copy算法并不直接适用,因为它们不是简单的序列容器。如果你需要复制map或set中的元素,通常使用循环遍历或者范围基于的for循环。

2、replace 算法

参数:

beg:源范围起始迭代器。
end:源范围结束迭代器。
oldvalue:要被替换的旧元素值。
newvalue:新元素值。

返回值:

无返回值,但会修改源容器中的元素。

例子:

#include <iostream>  
#include <vector>  
#include <algorithm>  int main() {  std::vector<int> vec = {1, 2, 3, 2, 5};  // 使用replace算法将vec中所有的2替换为10  std::replace(vec.begin(), vec.end(), 2, 10);  // 输出vec  for (int i : vec) {  std::cout << i << ' ';  }  return 0;  
}

对于map和set,replace算法也不适用,因为它们是根据键值对存储的,且不允许重复。如果需要替换map或set中的元素,你需要先找到该元素,然后修改它。

3、 replace_if 算法

参数:

beg:源范围起始迭代器。
end:源范围结束迭代器。
_callback:一个谓词(返回bool类型的函数对象或lambda表达式),用于判断哪些元素需要被替换。
newvalue:新元素值。

返回值:

无返回值,但会修改源容器中的元素。

例子:

#include <iostream>  
#include <vector>  
#include <algorithm>  int main() {  std::vector<int> vec = {1, 2, 3, 4, 5};  // 使用replace_if算法将vec中所有偶数替换为10  std::replace_if(vec.begin(), vec.end(), [](int i){ return i % 2 == 0; }, 10);  // 输出vec  for (int i : vec) {  std::cout << i << ' ';  }  return 0;  
}

对于map和set,同样地,replace_if算法不直接适用。如果需要基于条件替换map或set中的元素,你需要遍历容器,并对每个元素应用条件判断。

二、交换算法

1、swap 算法

参数:

c1:第一个容器。
c2:第二个容器。

返回值:

无返回值,但会交换两个容器的元素。

例子:

对于vector,swap算法可以直接用来交换两个容器的所有元素:

#include <iostream>  
#include <vector>  
#include <algorithm>  int main() {  std::vector<int> vec1 = {1, 2, 3};  std::vector<int> vec2 = {4, 5, 6};  // 使用swap算法交换vec1和vec2的元素  std::swap(vec1, vec2);  // 输出vec1和vec2  for (int i : vec1) {  std::cout << i << ' ';  }  std::cout << std::endl;  for (int i : vec2) {  std::cout << i << ' ';  }  return 0;  
}

然而,对于map和set,情况也是不适用该算法

2、map如何实现 swap

因为map和set的底层实现涉及到复杂的关联数据结构(如红黑树),它们没有提供直接交换两个容器内容的成员函数或算法。如果你需要交换两个map或set的内容,你需要自己实现这个过程,例如通过遍历一个容器并将元素插入到另一个容器中,同时清空第一个容器。

这里是一个简单的示例来展示如何交换两个map的内容:

#include <iostream>  
#include <map>  void swap_maps(std::map<int, int>& m1, std::map<int, int>& m2) {  // 先将m1的元素插入到m2中  for (const auto& kv : m1) {  m2[kv.first] = kv.second;  }  // 清空m1  m1.clear();  // 将m2的元素(原本m1的元素)移动回m1  for (const auto& kv : m2) {  m1[kv.first] = kv.second;  }  // 清空m2  m2.clear();  
}  int main() {  std::map<int, int> map1 = {{1, 10}, {2, 20}, {3, 30}};  std::map<int, int> map2 = {{4, 40}, {5, 50}, {6, 60}};  // 调用自定义的swap_maps函数交换map1和map2的内容  swap_maps(map1, map2);  // 输出map1和map2  for (const auto& kv : map1) {  std::cout << kv.first << ": " << kv.second << std::endl;  }  for (const auto& kv : map2) {  std::cout << kv.first << ": " << kv.second << std::endl;  }  return 0;  
}

请注意,上面的swap_maps函数是一个简单的实现,它假设两个map原本没有相同的键。如果可能存在相同的键,你需要先决定如何处理键冲突(比如保留一个,合并值,还是抛出异常)。

总结

包括copy、replace、replace_if和swap

  1. std::copy
template<class InputIt, class OutputIt>  
OutputIt copy(InputIt first, InputIt last, OutputIt d_first);first, last: 输入序列的开始和结束迭代器。
d_first: 输出序列的起始迭代器。
std::vector<int> src = {1, 2, 3, 4, 5};  
std::vector<int> dst(src.size());  
std::copy(src.begin(), src.end(), dst.begin());
  1. std::replace
template<class ForwardIt, class T, class U>  
void replace(ForwardIt first, ForwardIt last, const T& old_value, const U& new_value);
first, last: 序列的开始和结束迭代器。
old_value: 要被替换的值。
new_value: 替换成的新值。
std::vector<int> vec = {1, 2, 3, 2, 4};  
std::replace(vec.begin(), vec.end(), 2, 5);
  1. std::replace_if
template<class ForwardIt, class UnaryPredicate, class T>  
void replace_if(ForwardIt first, ForwardIt last, UnaryPredicate p, const T& new_value);
first, last: 序列的开始和结束迭代器。
p: 一元谓词,用于判断哪些元素需要被替换。
new_value: 替换成的新值。
std::vector<int> vec = {1, 2, 3, 4, 5};  
std::replace_if(vec.begin(), vec.end(), [](int n){ return n % 2 == 0; }, -1);
  1. std::swap
template<class T>  
void swap(T& a, T& b) noexcept(noexcept(a = std::move(b)) && noexcept(b = std::move(a)));
a, b: 要交换的两个对象的引用。

或者对于STL容器,也可以直接使用swap成员函数

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

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

相关文章

多线程--深入探究多线程的重点,难点以及常考点线程安全问题

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

Redis高可用主从复制与哨兵模式

前言 在生产环境中&#xff0c;除了采用持久化方式实现 Redis 的高可用性&#xff0c;还可以采用主从复制、哨兵模式和 Cluster 集群的方法确保数据的持久性和可靠性。 目录 一、主从复制 1. 概述 2. 作用 3. 主从复制流程 4. 部署 4.1 安装 redis 4.2 编辑 master 节…

物联网实战--入门篇之(七)嵌入式-MQTT

目录 一、MQTT简介 二、MQTT使用方法 三、MQTT驱动设计 四、代码解析 五、使用过程 六、总结 一、MQTT简介 MQTT因为其轻量、高效和稳定的特点&#xff0c;特别适合作为物联网系统的数据传输协议&#xff0c;已经成为物联网事实上的通信标准了。关于协议的具体内容看看这…

后端前行Vue之路(三):计算属性和监视属性

1.概述 书接上回&#xff0c;我们讲述了《后端前行Vue之路(二)&#xff1a;模版语法之插值与指令》谈到了Vue的模板语法很强大&#xff0c;支持复杂表达式&#xff0c;如下&#xff1a; <div id"example">{{ message.split().reverse().join() }} </div&g…

Supervised Fine-tuning in turn Improves Visual Foundation Models

简介 从NLP中的监督微调&#xff08;Supervised Fine-tuning&#xff09;获得的灵感&#xff0c;本文探索了细粒度SFT在预训练后增强视觉基础模型潜力。本文提出了一种二阶段方法ViSFT释放视觉基础模型细粒度知识。具体地&#xff0c;通过一些域内任务执行视觉联合学习增强视觉…

编程实战:自己编写HTTP服务器(系列9:上传文件)

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 本系列的源码位于httpd目录下…

Java实现两数相除

题意 给你两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求不使用乘法、除法和取余运算。 整数除法应该向零截断&#xff0c;也就是截去&#xff08;truncate&#xff09;其小数部分。例如&#xff0c;8.345 将被截断为 8 &#xff0c;-2.7335…

用DasViewer浏览模型时可以移动模型的中心点吗?

按住鼠标中键&#xff0c;就正常平移模型了。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅的加载较大规模实景三维模型,提供方便快捷的数据浏览操作。 DasViewer下载地址&#xff1a;…

leetcode 热题 100(部分)C/C++

leetcode 热题 100 双指针 盛最多水的容器 【mid】【双指针】 思路&#xff1a; 好久没写代码sb了&#xff0c;加上之前写的双指针并不多&#xff0c;以及有点思维定势了。我对双指针比较刻板的印象一直是两层for循环i&#xff0c;j&#xff0c;初始时i,j都位于左界附近&…

SAM Self-Attention based Deep Learning Method

一、Why(Research Background) 网络流量分类根据协议(如超文本传输协议或域名系统)或应用程序(如脸书或Gmail)对流量类别进行分类。其准确性是一些网络管理任务(如服务质量控制、异常检测等)的关键基础。为了进一步提高流量分类的准确性,最近的研究引入了基于深度学习的方法…

Open CASCADE学习|刚体( TopoDS_Shape)按某种轨迹运动,停在指定位置上

今天实现如下功能&#xff1a;刚体做做螺旋运动&#xff0c;轨迹已知&#xff0c;求刚体在每个位置上的所占据的空间&#xff0c;就是把刚体从初始位置变换到该位置。 这里的刚体是一个砂轮截面&#xff0c;螺旋运动轨迹由B样条曲线拟合&#xff0c;通过Frenet标架确定运动轨迹…

datalist是什么,有什么作用?

<datalist>标签用于定义一个预定义选项列表&#xff0c;它可以与文本输入框&#xff08;<input type"text">&#xff09;一起使用&#xff0c;提供一组可选的值供用户选择或输入。<datalist>标签中的选项可以通过<option>标签来定义。 <…

多线程(29)Semaphore

Semaphore&#xff08;信号量&#xff09;是一种常用的并发控制技术&#xff0c;用于管理对一组资源的访问控制。信号量的核心是一个计数器&#xff0c;表示可用资源的数量。计数器的值可以初始化为任意值&#xff0c;如果初始化为1&#xff0c;则成为一个互斥锁&#xff08;Mu…

iOS使用CoreML运用小型深度神经网络架构对图像进行解析

查找一个图片选择器 我用的是ImagePicker 项目有点老了&#xff0c;需要做一些改造&#xff0c;下面是新的仓库 platform :ios, 16.0use_frameworks!target learnings dosource https://github.com/CocoaPods/Specs.gitpod ImagePicker, :git > https://github.com/KevinS…

Python之Opencv进阶教程(1):图片模糊

1、Opencv提供了多种模糊图片的方法 加载原始未经模糊处理的图片 import cv2 as cvimg cv.imread(../Resources/Photos/girl.jpg) cv.imshow(girl, img)1.1 平均值 关键代码 # Averaging 平均值 average cv.blur(img, (3, 3)) cv.imshow(Average Blur, average)实现效果 1.2…

STM32F407 FSMC并口读取AD7606

先贴一下最终效果图.这个是AD7606并口读取数据一个周期后的数据结果. 原始波形用示波器看是很平滑的. AD7606不知为何就会出现干扰, 我猜测可能是数字信号干扰导致的. 因为干扰的波形很有规律. 这种现象基本上可以排除是程序问题. 应该是干扰或者数字信号干扰,或者是数字和模拟…

基于Spring Boot的餐厅点餐系统

基于Spring Boot的餐厅点餐系统 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 部分系统展示 管理员登录界面 用户注册登录界面 …

​如何使用ArcGIS Pro进行洪水淹没分析

洪水淹没分析是一种常见的水文地理信息系统应用&#xff0c;用于模拟和预测洪水事件中可能受到淹没影响的地区&#xff0c;这里为大家介绍一下ArcGIS Pro进行洪水淹没分析的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM数据&…

Python学习笔记-Flask接收post请求数据并存储数据库

1.引包 from flask import Flask, request, jsonify from flask_sqlalchemy import SQLAlchemy 2.配置连接,替换为自己的MySQL 数据库的实际用户名、密码和数据库名 app Flask(__name__) #创建应用实列 app.config[SQLALCHEMY_DATABASE_URI] mysqlpymysql://ro…

优化 Nginx 处理 504 Gateway Timeout 错误

简介 504 Gateway Timeout 错误表示 Nginx 在指定的时间内没有从上游服务器收到响应。这可能是由于上游服务器处理时间过长或网络连接问题造成的。 调整 Nginx 参数 为了解决 504 错误&#xff0c;可以调整以下 Nginx 参数&#xff1a; **proxy_read_timeout&#xff1a;**指…