当前位置: 首页 > news >正文

笔记82:关于 C++ 中的 swap 函数

背景:在刷题代码随想录时发现参考代码使用了swap函数,但是是用来交换一个vector容器中的两个元素的;但是我依稀记得标准模板库中vector函数自带的swap函数是用来交换两个容器内所有的元素的;


一、STL中的swap()函数:

注意:这是头文件<algorithm>中包含的函数,他是配合容器来使用的

  • 功能描述:互换两个容器的元素
  • 函数原型1:swap(container c1, container c2)
  • 函数原型2:container c1.swap(container c2)
  • 参数:容器1的名字 + 容器2的名字
  • 作用方式:函数swap()真正的作用,其实并没有对内存动手脚,就是把v1和v2这两个容器名的指向换了一下
  • 补充说明:swap()有一个很实用的功能,但是需要其他函数的辅助,这个功能是【收缩内存】,具体提及这个功能在【202_36_vector容器_互换容器】这一节内

二、std::swap()函数:

注意:在题目代码随想录中使用的swap函数是这个,这是标准命名空间中提供的函数

  • 功能描述:交换两个变量的值

实现方式1:创建临时空间,用来交换两个变量的值

int temp = a;
a = b;
b = temp;

实现方式2:不建立临时空间,同样可以实现交换两个变量的值

# 加减法
a = a + b;
b = a - b;
a = a - b;# 补充:该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失
# 乘除法
a = a * b;
b = a / b;
a = a / b;补充1:与加减法类似,可以处理整型和浮点型变量,但在处理浮点型变量时也存在精度损失问题,而且乘除法比加减法要多一条约束,即b必不为0
补充2:可能经验上的某种直觉告诉我们,加减法和乘除法可能会溢出,而且乘除的溢出会特别严重。其实不然,采用这两种方法都不会溢出。以加减法为例,第一步的加运算可能会造成溢出,但它所造成的溢出会在后边的减运算中被溢出回来。

实现方式3:采用二进制,使用异或

# 异或法
a ^= b;       //a=a^b
b ^= a;       //b=b^(a^b)=b^a^b=b^b^a=0^a=a
a ^= b;       //a=(a^b)^a=a^b^a=a^a^b=0^b=b# 补充:异或法可以完成对整型变量的交换,但是对于浮点型变量它无法完成交换。

相关文章:

  • 电子模拟卷1
  • V R元宇宙平台的未来方向|V R主题馆加 盟|游戏体验馆
  • 【Hive】with 语法 vs cache table 语法
  • 机器学习:探索数据中的模式与智能
  • 【笔记】以论文发表形式通俗理解 TCP/IP模型
  • linux 命令行下的计算器
  • 【论文阅读】Faster Neural Networks Straight from JPEG
  • 【C语言基础】:字符串函数(二)
  • js的事件
  • hive授予指定用户特定权限及beeline使用
  • 【C++】静态成员
  • 单链表的查找
  • Python第三次作业
  • Linux:环境变量的特性及获取
  • OpenAI奥特曼豪赌1.42亿破解长生不老
  • @jsonView过滤属性
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Apache Pulsar 2.1 重磅发布
  • Apache的80端口被占用以及访问时报错403
  • css布局,左右固定中间自适应实现
  • JSDuck 与 AngularJS 融合技巧
  • Odoo domain写法及运用
  • Promise面试题2实现异步串行执行
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SpiderData 2019年2月16日 DApp数据排行榜
  • ubuntu 下nginx安装 并支持https协议
  • Vue2.x学习三:事件处理生命周期钩子
  • Zsh 开发指南(第十四篇 文件读写)
  • 关于Java中分层中遇到的一些问题
  • 京东美团研发面经
  • 驱动程序原理
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 王永庆:技术创新改变教育未来
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • !!java web学习笔记(一到五)
  • # .NET Framework中使用命名管道进行进程间通信
  • #include<初见C语言之指针(5)>
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (12)Hive调优——count distinct去重优化
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (搬运以学习)flask 上下文的实现
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .net 调用php,php 调用.net com组件 --
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET4.0并行计算技术基础(1)
  • .net对接阿里云CSB服务