STL中的swap函数

2023-05-16

swap函数执行会调用容器内数据类型的,拷贝构造和赋值函数调用

对自定义类型使用STL algorithm中的swap函数,会调用自定义的类型的拷贝构造函数一次,赋值函数两次;自定义类型中没有定义那么就会使用默认的拷贝构造函数和赋值函数。 如果是容器,那么会遍历容易进行赋值。

swap函数可用于清空vector和string类型容器分配的内存空间

对于vector, string, basic_string容器clear后不会释放占有的内存空间capacity,而只是减少了内存上的数据元素size。
如果要对vector,string进行清空不再使用的内存,那么需要调用swap来清理掉。其它的stl容器调用clear时候是会清空内存空间的。

STL中的swap源码:

/ TEMPLATE FUNCTION swap (from <algorithm>)
template<class _Ty> inline
 void swap(_Ty& _Left, _Ty& _Right)
 { // exchange values stored at _Left and _Right
 _Ty _Tmp = _Move(_Left);
 _Left = _Move(_Right);
 _Right = _Move(_Tmp);
 }

测试例子

#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
struct tagStudent
 {
  int m_nID;
  int m_nScore;
  tagStudent& operator =(const tagStudent &b)
  {
   this->m_nID = b.m_nID;
   this->m_nScore = b.m_nScore;
   return *this;
  }
  tagStudent( const tagStudent &b)
  {
   this->m_nID = b.m_nID;
   this->m_nScore = b.m_nScore;
  }

  tagStudent( int nID, int nScore )
  {
   this->m_nID = nID;
   this->m_nScore = nScore;
  }

 };
void main()
{
    tagStudent AStudent(2, 20);
    tagStudent BStudent(3, 80);
    // 在tagStudent中的拷贝构造和赋值函数中打断点会发现,拷贝构造调用了一次,赋值函数调用了两次
    std::swap( AStudent, BStudent);
    int x = 10;  
    //vector<int> myContainer(10000, x); 
    string myContainer(10000,'\0');

    //这里打印仅仅是元素的个数不是内存大小  
    cout << "myContainer size :"  << myContainer.size() << ", capacity:"<< myContainer.capacity()<< endl; 

    myContainer.clear();;
    cout << "after clear size :"  << myContainer.size() << ", capacity:"<< myContainer.capacity()<< endl;  
    //swap交换函数释放内存:vector<T>().swap(X);  
    //T:int ; myvertor代表X  
    //vector<int>().swap(myContainer);
    string().swap(myContainer); 

    //两个输出仅用来表示swap前后的变化  
    cout << "after swap size :"  << myContainer.size() << ", capacity:"<< myContainer.capacity()<< endl;  
    // 并不是所有的STL容器的clear成员函数的行为都和vector一样。事实上,其他容器的clear成员函数都会释放其内存。
 }

运行结果如下:

这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL中的swap函数 的相关文章

随机推荐

  • Nginx学习(10)—— event模块、core模块、变量

    文章目录 core模块Nginx启动模块 event模块event的类型和功能accept锁 定时器变量Nginx中的变量指的是什么Nginx中如何创建变量Nginx中如何使用变量举个例子 Nginx的模块种类有很多 xff0c 除了HTT
  • Nginx学习(11)—— Nginx源码架构、configure是怎么执行的(编译的具体细节)

    文章目录 Nginx的源码目录结构Nginx中configure的原理auto脚本 模块编译顺序 Nginx的源码目录结构 nginx的源码目录与nginx的模块化以及功能的划分是紧密结合 xff0c 这也使得我们可以很方便地找到相关功能的
  • C语言中命令行工具 (getopt和getopt_long)

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • C#与Java的比较

    关于java和C 争论不是一年两年了 贬低C 的文章也看过了很多 说一下个人见解 C 本身并不是不如java C 的优势在于学了之后在web和winform之间可以自由切换 web现在 net mvc已经效率很高了 企业级的应用现在很受欢迎
  • vs2010 和 vs2012同时安装遇到的问题

    安装VS2012后遇到的问题 悲剧的种子是在上个月初种下的 9月份微软发布了Visual Studio2012 xff08 发布会 xff09 xff0c 我是个对各种 新版本 极有偏好的人 xff0c 一看到新闻就立刻下载了VS2012
  • React警告:Received NaN for the `children` attribute. If this is expected, cast the value to a string.

    使用React框架时 xff0c 组件在使用 lt span gt Math abs goal goalInfo pretimes goal usergoalInfo cpt times lt span gt 这一语句时出现警告 xff1a
  • 持续请求/socket.io/?EIO=3&transport=polling&t=N8HrzIR

    项目基本介绍 xff1a 使用React xff0c webpack xff0c socket io client Node js Express socket io 等技术 xff0c 采用前后端分离开发 实现项目中的聊天室时遇到报错 x
  • node-xlsx 生成并下载有超链接的excel文件

    需求 xff1a 将微信小程序云数据库中的数据导出为excel文件 xff0c 文件按团队分为不同的sheet页 xff0c 首页汇总每个sheet页的数据总数 xff0c 并可点击跳转至对应的sheet页 下载时可选择今年某月份进行下载对
  • Vue通过v-for渲染的元素与$refs得到的实例对应不上

    开发时遇到一个bug xff1a 通过v for渲染出几个搜索条件组件 xff08 对应的数组数据记为selectList xff09 xff0c 通过其他方式修改了这些筛选条件对应的数据selectList xff0c 之后通过 refs
  • iView的Select 选择器选择失效

    问题 xff1a 给iView的Select赋的值通过接口获取 xff0c 得到数组 list xff0c 选择器的默认值 defaultValue 为数组list的第一个选择项 xff08 defaultValue 61 list 0 x
  • 不同路由对应同一组件页面

    在vue中 xff0c 当不同路由对应同一组件页面时会发生再次进入页面时不再重新渲染 xff08 为了更高效 xff0c 所以vue进行了复用 xff09 的问题 xff0c 整理一下解决办法 xff0c 如下 xff1a 方式一 Watc
  • /deep/样式穿透失效的原因和解决办法

    问题 xff1a vue页面中 xff08 样式使用less书写 xff09 xff0c 对iview的组件使用 deep 进行样式穿透修改默认样式 xff0c 发现在Google Chrome版本64上看样式修改成功 xff0c 但在火狐
  • 错误:ERROR in ./node_modules/_webpack-dev-server...Module not found: Error: Can't resolve 'webpack/hot

    学习webpack的途中总是困难重重 使用webpack dev server工具时 xff0c 运行cnpm run dev后报错 xff1a ERROR in node modules webpack dev server 64 2 1
  • 带参数的宏定义与有参函数的区别

    1 先介绍一下什么是宏定义 宏定义属于C语言编译系统中编译预处理中的一部分 xff08 但编译预处理不是C语言的语句 xff09 xff0c 其作用是为编译系统提供必要的前置信息 xff0c 告诉编译系统在源程序进行编译之前应该做些什么 它
  • UART接口控制器-RS-232的9脚接口

    RS 232常见引脚信号的定义 RXD 接收数据 xff0c TXD 发送数据 xff0c DTR 数据终端准备 xff0c GND 信号地 xff0c DSR 数据设备准备好 xff0c RTS 请求发送 xff0c CTS 清除发送 串
  • 去掉字符串最后一个字符的方法

    C 开发过程中一般都需要进行字符串的格式化处理 xff0c xff0c 以下提供去掉字符串最后一个字符的方法 如果是其他语言开发的话仅供参考有可能写法不一样 xff0c 但是意思是一样的 字符串 xff1a string s 61 34 1
  • C++11之lambda函数

    最近一直在看mesos的源代码 xff0c mesos中用到了很多C 43 43 11的新特性 xff0c lambda函数就是其中的一个 对于lambda函数简单的来说就是java中的匿名函数 语法定义 capture paramente
  • C++中两个类互相包含

    今天突然想起一个C 43 43 的问题 xff0c 如果一个类A包含类B的实例 xff0c 而实例B也包含另一个类A xff0c 这种方式的代码应该怎么写 xff0c 按照一般的开发者的想法的代码如下 xff1a 文件A h span cl
  • 命名空间

    命名空间的作用 命名空间是为了防止名字冲突提供更加可控的机制 命名空间分割了全局命名空间 xff0c 其中每一个命名空间是一个作用域 命名空间的定义 命名空间由三部分组成 xff0c 分别是namespace 空间名字和一系列由花括号括起来
  • STL中的swap函数

    swap函数执行会调用容器内数据类型的 xff0c 拷贝构造和赋值函数调用 对自定义类型使用STL algorithm中的swap函数 xff0c 会调用自定义的类型的拷贝构造函数一次 赋值函数两次 xff1b 自定义类型中没有定义那么就会