c++ std::swap() 函数
c++ std::swap() 函数
最近刚开始学习c++容器,发现容器中提供的swap()函数并不是交换了两个容器的内容,而是交换了两个容器的地址。比如如下代码:
#include <vector>
#include <iostream>
using namespace std;template<class Os, class Co> Os& operator<<(Os& os, const Co& co) {os << "{";for (auto const& i : co) { os << ' ' << i; }return os << " } ";
}int main()
{vector<int> a{1,2,3,4,5};vector<int> b{9,8,7};cout<<a<<endl;cout<<b<<endl;int &ref1 = a.front();int &ref2 = b.front();auto iter1 = ++a.begin();auto iter2 = ++b.begin();cout<<"ref1 = "<<ref1<<", "<<"ref2 = "<<ref2<<endl;cout<<"*iter1 = "<<*iter1<<", "<<"*iter2 = "<<*iter2<<endl;a.swap(b);cout<<a<<endl;cout<<b<<endl;cout<<"ref1 = "<<ref1<<", "<<"ref2 = "<<ref2<<endl;cout<<"*iter1 = "<<*iter1<<", "<<"*iter2 = "<<*iter2<<endl;return 0;
}
输出为:
{ 1 2 3 4 5 }
{ 9 8 7 }
ref1 = 1, ref2 = 9
*iter1 = 2, *iter2 = 8
{ 9 8 7 }
{ 1 2 3 4 5 }
ref1 = 1, ref2 = 9
*iter1 = 2, *iter2 = 8
可见容器a、b只是交换了指向的地址。那c++提供的std::swap()是否也是只交换地址呢,这里我们来实验一下。
#include <iostream>int main(){int a=4;int b=6;int *pa=&a;int *pb=&b;std::swap(a,b);std::cout<<a<<'\t'<<b<<std::endl;std::cout<<*pa<<'\t'<<*pb<<std::endl;std::swap(pa,pb);std::cout<<a<<'\t'<<b<<std::endl;std::cout<<*pa<<'\t'<<*pb<<std::endl;std::swap(*pa,*pb);std::cout<<a<<'\t'<<b<<std::endl;std::cout<<*pa<<'\t'<<*pb<<std::endl;}
输出的结果为:
6 4
6 4
6 4
4 6
4 6
6 4
可见,交换 a、b的同时,指针指向的内存内容同时也改变了,说明此时交换的是 a、b变量中的内容,而不是改了a、b的地址。如果a、b是两个数组,swap(a,b) 就等同于代码中的swap(pa,pb)。交换的也是a、b的内容(此时a、b内存的是数组首变量地址),在效果上类似于a、b数组交换了。
一点愚见,欢迎指正。
c++ std::swap() 函数相关推荐
- C++ std::swap函数的使用
功能描述 交换两个变量的值,譬如参数A和参数B,把A的值赋给B,再把B的值赋给A参数 函数原型 swap(_Tp& __a, _Tp& __b) 参数释义 - 参数 __a 一个任 ...
- c语言中swap函数_C ++中的swap()函数
c语言中swap函数 介绍 (Introduction) In this tutorial, we are going to learn the swap() function in C++ prog ...
- 《Effective C++》item25:考虑写出一个不抛异常的swap函数
std::swap()是个很有用的函数,它可以用来交换两个变量的值,包括用户自定义的类型,只要类型支持copying操作,尤其是在STL中使用的很多,例如: int main(int argc, _T ...
- C++STL中swap函数操作与内存地址改变的简析
写在前面 这篇文章主要讨论了STL中swap函数在交换2个容器的内容的时候是交换内存还是交换元素的问题.由于博主对C++的学习并不好,如果有什么错误恳请大家提出.下面会有一些代码展示一下swap函数在 ...
- stl swap函数_vector :: swap()函数以及C ++ STL中的示例
stl swap函数 C ++ vector :: swap()函数 (C++ vector::swap() function) vector::swap() is a library functio ...
- stl swap函数_C ++ STL | vector :: swap()函数与示例
stl swap函数 C ++ STL vector :: swap()函数 (C++ STL vector::swap() function) vector::swap() function is ...
- swap函数_C++ vector成员函数实现[持续更新]
此篇是 配合cppreference-zh-20200816.chm学习 <vector>, <stl_vector.h>和<vector.tcc>源码的笔记 环境 ...
- 【转】 谈谈C++中的swap函数
1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. 1 template <class T> void swap ( T& a, T& b ) 2 { 3 ...
- 谈谈C++中的swap函数
1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. template <class T> void swap ( T& a, T& b ) {T c(a); ...
最新文章
- 新的小游戏发布啦。Pop Jungle
- 2017-2018-1 20155320 《信息安全系统设计基础》第十四周学习总结
- JVM 史上最最最完整知识总结!
- 关于list.extend(iterable)
- 又一个“众所周知”的DAL层设计BUG
- python基础 实战作业 ---Excel基本读写与数据处理
- 20190929每日一句
- 前端开发_HTML5_布局-div+css布局
- 小米路由器4a开发版固件_小米路由器 4A 刷入lean 的 openwrt/lede
- ★C语言期末课程设计★——教师工资管理系统(详细报告+源代码+详细注释)
- HTMLTestRunner测试报告美化
- 老王python培训视频教程完整版
- Mac上配置svn diff为kdiff3
- Ann Rheum Dis | 华科韩金祥/宁康等发现微生物失调和代谢紊乱在类风湿关节炎中的作用...
- 在阿里云轻量应用服务器上安装爱快软路由
- MySQL之查询关键字
- 自制新型文字密码,聊天记录的画风都不一样了,再也不怕被女朋友偷窥手机了!
- CSS3新特性详细介绍
- super()的两个参数
- 如何设置html的背景效果,背景图片的透明度如何设置(CSS)
热门文章
- java 变量类型_Java 变量类型
- Kestrel封装在WindowService中(.net5,.net6,.net7三个版本的介绍)
- 计算机读心术的原理,读心术的原理笑容的奥秘
- AMM算法简要理解(Adleman-Mander-Miller Method)
- 00_51入门知识累计_C51简介
- iOS开发系列课程(10) --- 表格视图
- 基于matlab语音增强,基于MATLAB的语音增强系统的设计
- 改善程序员脑力的70条方法
- 好玩的Python-摩斯码发报机
- 使用迅搜制作站内搜索引擎-安装篇