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() 函数相关推荐

  1. C++ std::swap函数的使用

    功能描述 交换两个变量的值,譬如参数A和参数B,把A的值赋给B,再把B的值赋给A参数 函数原型 swap(_Tp& __a, _Tp& __b) 参数释义 - 参数  __a  一个任 ...

  2. c语言中swap函数_C ++中的swap()函数

    c语言中swap函数 介绍 (Introduction) In this tutorial, we are going to learn the swap() function in C++ prog ...

  3. 《Effective C++》item25:考虑写出一个不抛异常的swap函数

    std::swap()是个很有用的函数,它可以用来交换两个变量的值,包括用户自定义的类型,只要类型支持copying操作,尤其是在STL中使用的很多,例如: int main(int argc, _T ...

  4. C++STL中swap函数操作与内存地址改变的简析

    写在前面 这篇文章主要讨论了STL中swap函数在交换2个容器的内容的时候是交换内存还是交换元素的问题.由于博主对C++的学习并不好,如果有什么错误恳请大家提出.下面会有一些代码展示一下swap函数在 ...

  5. stl swap函数_vector :: swap()函数以及C ++ STL中的示例

    stl swap函数 C ++ vector :: swap()函数 (C++ vector::swap() function) vector::swap() is a library functio ...

  6. stl swap函数_C ++ STL | vector :: swap()函数与示例

    stl swap函数 C ++ STL vector :: swap()函数 (C++ STL vector::swap() function) vector::swap() function is ...

  7. swap函数_C++ vector成员函数实现[持续更新]

    此篇是 配合cppreference-zh-20200816.chm学习 <vector>, <stl_vector.h>和<vector.tcc>源码的笔记 环境 ...

  8. 【转】 谈谈C++中的swap函数

    1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. 1 template <class T> void swap ( T& a, T& b ) 2 { 3 ...

  9. 谈谈C++中的swap函数

    1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. template <class T> void swap ( T& a, T& b ) {T c(a); ...

最新文章

  1. 新的小游戏发布啦。Pop Jungle
  2. 2017-2018-1 20155320 《信息安全系统设计基础》第十四周学习总结
  3. JVM 史上最最最完整知识总结!
  4. 关于list.extend(iterable)
  5. 又一个“众所周知”的DAL层设计BUG
  6. python基础 实战作业 ---Excel基本读写与数据处理
  7. 20190929每日一句
  8. 前端开发_HTML5_布局-div+css布局
  9. 小米路由器4a开发版固件_小米路由器 4A 刷入lean 的 openwrt/lede
  10. ★C语言期末课程设计★——教师工资管理系统(详细报告+源代码+详细注释)
  11. HTMLTestRunner测试报告美化
  12. 老王python培训视频教程完整版
  13. Mac上配置svn diff为kdiff3
  14. Ann Rheum Dis | 华科韩金祥/宁康等发现微生物失调和代谢紊乱在类风湿关节炎中的作用...
  15. 在阿里云轻量应用服务器上安装爱快软路由
  16. MySQL之查询关键字
  17. 自制新型文字密码,聊天记录的画风都不一样了,再也不怕被女朋友偷窥手机了!
  18. CSS3新特性详细介绍
  19. super()的两个参数
  20. 如何设置html的背景效果,背景图片的透明度如何设置(CSS)

热门文章

  1. java 变量类型_Java 变量类型
  2. Kestrel封装在WindowService中(.net5,.net6,.net7三个版本的介绍)
  3. 计算机读心术的原理,读心术的原理笑容的奥秘
  4. AMM算法简要理解(Adleman-Mander-Miller Method)
  5. 00_51入门知识累计_C51简介
  6. iOS开发系列课程(10) --- 表格视图
  7. 基于matlab语音增强,基于MATLAB的语音增强系统的设计
  8. 改善程序员脑力的70条方法
  9. 好玩的Python-摩斯码发报机
  10. 使用迅搜制作站内搜索引擎-安装篇