交换操作 swap

一个类定义一个swap函数通常需要一次拷贝和两次赋值

例如 A类的两个对象v1与v2交换

A temp=v1;  //copy构造一个临时对象

v1=v2;    //赋值运算

v2=temp;    //赋值运算

如果采用指针交换则可以减少一次拷贝构造

A* temp=v1;

v1=v2;    //赋值运算

v2=temp;    //赋值运算

分清swap与std::swap的使用

std::swap是标准库定义的,一般内置类型直接用即可,如果涉及自定义的类则使用自定义的swap。

void swap(A& lhs,A& rhs)   //A自定义了swap函数
{
  std::swap(lhs.h,rhs.h);  //这是错误的
  ……
}

void swap(A& lhs,A& rhs)   //A自定义了swap函数
{
  using std::swap;
  swap(lhs.h,rhs.h);  //使用了A定义的swap函数
  ……
}

赋值运算符中使用swap实现copy and swap技术

A& A::operator=(A rhs)
{
  swap(*this,rhs);
  return *this;
}

参数rhs不是一个引用,通过传值方式传递,是右侧运算对象的一个副本。

交换对象后,这个副本会调用析构函数自动删除,delete了交换前的资源。

这个技术的优势是一方面保证了自赋值安全,另一方面就是天然的异常安全。

异常安全体现在代码唯一的抛出异常是构造函数的new表达式,如果发生会在交换之前。

时间: 2024-10-21 03:32:05

交换操作 swap的相关文章

【足迹C++primer】44、交换操作

交换操作 class HasPtr { friend void fun2(); friend void swap(HasPtr&, HasPtr&); public: // HasPtr()=default; HasPtr(const string &s=string()):ps(new string(s)), i(0){} //对ps指向的string,每个HasPtr对象都有自己的拷贝 HasPtr(const HasPtr &p):ps(new string(*p.p

拷贝控制2(拷贝控制和资源管理/交换操作)

为了定义拷贝构造函数和拷贝赋值运算符,我们首先必须确认此类型对象的拷贝语义.通常可以定义拷贝操作,使类的行为看起来像一个值或者像一个指针(即所谓的深拷贝和浅拷贝) 类的行为像一个值,意味着它应该也有自己的状态.当我们拷贝一个像值的对象时,副本和原对象是完全独立的.改变副本不会对原对象有任何影响,反之亦然 行为像指针的类则共享状态.当我们拷贝一个这种类的对象时,副本和原对象使用相同的底层数据.改变副本也会改变原对象,反之亦然 在我们使用过的标准库类中,标准库容器和 string 类的行为像一个值.

通过交换操作,调整数组元素位置

问题描述:有一个长度为N的整形数组row,由0至N-1这N个数字乱序组成(每个数组出现且仅出现一次).现在你可以对这个数组的任意两个不同的元素进行交换.问:对于一个给定的这种数组,若要把这个数组变为从小到大排好序的操作(即,对于数组的任意下标,均有 I == row[i] 成立),最少需要进行多少次交换? 首先,举几个简单的例子: 例子1: 下标 0 1 2 3 4 值 0 3 2 1 4 只需1次交换即可:把row中下标为1的元素和下标为3的元素进行交换,记为swap(row, 1, 3).

关于swap交换操作的新方法

swap: 在oi中,swap用于交换两个变量的数值. 初学oi时,我们这样操作: 也就是说,需要一个temp变量来寄存x或y的值,因为当一个变量被赋值成为另一个变量时,没有temp它的值会丢失. 貌似很基础的亚子. 进阶版: 进阶版swap不在需要中间变量temp,常数也更优: 具体是这样的: int sswap(int &x, int &y) { x ^= y ^= x ^= y ; } 原理:一个数经过两次异或后,等于自己: 实在不理解手动膜你啦. 于是我们把上面的式子疯狂展开: 还

linux下的交换分区swap

linux下的交换空间 交换分区的作用: 当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行 的程序使用.那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被 临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中.这样,系 统总是在物理内存不够时,才进行Swap交换. ========================================================================

linux 交换分区 swap

linux swap分区用来保证内存过载时也可以使用,是在磁盘级别对内存的一次扩展,swap分区必须是一个单独的分区 创建过程: 1.用fdisk 命令新建分区,在创建过程中通过L命令和t命令来调整分区类型为 linux swap类型   2.mkswap 将分区格式化为swap类型   3.启用和关闭交换分区 使用swapon和 swapoff /dev/partition name swapon -a 启用所有定义在/etc/fstab中的交换分区 回环设备 loopback,使用软件来模拟

Linux设置交换分区swap

参考: http://www.vpser.net/opt/vps-add-swap.html https://www.zntec.cn/archives/vps-swap.html http://yzs.me/1431.html 添加: #step 1 生成Swap文件(256MB为例) sudo dd if=/dev/zero of=/var/swapfile bs=1024 count=262144 #step 2 设置交换分区 sudo mkswap /var/swapfile #step

添加交换分区swap

方法一:新建分区 使用fdisk工具新建一个分区 [[email protected]_168_102_centos ~]# fdisk /dev/xvdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0xad066822. Changes will remain in mem

linux添加交换分区swap增加虚拟内存

阿铭linux学习笔记之swap分区 一.作用: swap分区是交换分区,在系统物理内存不足时与swap进行交换,对web服务器的性能影响极大,通过调整swap分区大小来提升服务器的性能,节省资源费用. 二.步骤: 1.先创建一个swap文件 命令如下: dd  if=/dev/zero of=/tmp/swap bs=1024k count=1000 查看现在的系统内存: free -m  :'-m' 是将结果以'MB'的形式显示出来 2.格式化我们创建的swap文件 命令: mkswap -