swap()

一、使用第三方变量实现变量值交换

注意:C语言中没有template,C++中有

template<class T>
void swap( T &val1, T &val2 )
{
T temp = val1;
val1 = val2;
val2 = temp;
}

template<class T>
void swap( T *v1, T *v2 )
{
T temp = *v1;
*v1 = *v2;
*v2 = temp;
}

二、不使用第三方变量

template<class T> void swap( T &v1, T &v2 )

{

T temp = v1 + v2;

v1 = temp - v1;

v2 = temp - v1;

}

说明:方法1比方法2耗费一个变量内存空间,而方法2由于存在加法可能会溢出。标准库中使用的是第1种方法。

三、逻辑运算法

说明:此时的T只能是int系列和char系列

template<class T>
void swap1( T &t1, T &t2 )
{
t1 = t1^t2;
t2 = t1^t2;
t1 = t1^t2;
}

此方法的原理依据(异或运算):

a^a = 0 (同则为0)

a^1 = ~a      a^0 = a

a^b^c满足交换律和结合律

综述,逻辑运算法相对来说可读性差,但是既不会耗费变量内存空间,又不会溢出,但是只能用于int和char系列。

第1种方法比第2中方法较好,因为不会溢出,而一个内存变量空间的耗费在普通工程应用中不值一提。

时间: 2024-11-06 23:26:31

swap()的相关文章

Leetcode-24 Swap Nodes in Pairs

#24. Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should return the list as 2->1->4->3. Your algorithm should use only constant space. You may not modify t

swap function &amp; copy-and-swap idiom

在C++中,众所周知在一个资源管理类(例如含有指向堆内存的指针)中需要重新定义拷贝构造函数.赋值运算符以及析构函数(Big Three),在新标准下还可能需要定义移动构造函数和移动赋值运算符(Big Five).但实际上,这条规则还可以有一个小扩展.就是在资源管理类中,往往需要重新定义自己的swap函数来作为优化手段. 1. swap函数 首先考察如下例子,假设类HasPtr中含有一个指向string的指针 *ps 和一个int类型值value. class HasPtr { public: .

chapter8:Linux磁盘与文件系统管理之(5)swap的构建

当内存不够时,为了让后续的程序可以运行,将在内存中暂不用的程序调到swap.因此用到swap时性能会下降.现在一般个人电脑不会用到swap了,不过服务器还是有可能用到,但是我们一般都还是设置一下. 1.利用物理分区构建swap 2.利用文件构建swap(loop设备)

[Linux]创建和启用Swap交换区

如果你的服务器的总是报告内存不足,并且时常因为内存不足而引发服务被强制kill的话,在不增加物理内存的情况下,启用swap交换区作为虚拟内存是一个不错的选择,我购买的DigitalOcean VPS 512M内存基本不够用的,好在VPS的母鸡使用的SSD,正常读写速度都在300MB/s以上,启用swap后性能提高了不少,特别是在处理消耗大内存的脚本方面 创建交换区原则:1.创建的swap交换区大小应该大于实际物理内存的容量大小,但是不要过大,以免造成硬盘空间浪费.2.如果内存IO请求频繁,而单一

4.5/4.6 磁盘格式化 4.7/4.8 磁盘挂载 4.9 手动增加swap空间

4.5/4.6 磁盘格式化 4.7/4.8 磁盘挂载 4.9 手动增加swap空间 4.5/4.6 磁盘格式化 磁盘格式化 上 根/  和 /boot 都是  xfs centos6 之前的版本 文件格式系统ext4 6 是ext5 5 是 ext 3 再往前 ext 2 centos 7 默认 是 xfs   作为它的默认文件系统 fdisk -l 查看下 之前的分区 没有分,先分一个新的分区 现在给他格式化 mke2fs mke2fs -t 指定格式化的文件系统 比如要指定ext4 mke2

LeetCode解题思路:627. Swap Salary

Given a table salary, such as the one below, that has m=male and f=female values. Swap all f and m values (i.e., change all f values to m and vice versa) with a single update query and no intermediate temp table. For example: | id | name | sex | sala

CAS(Compare And Swap)分析

CAS(Compare And Swap)指的是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令.这个指令会对内存中的共享数据做原子的读写操作. 简单介绍一下这个指令的操作过程:首先,CPU会将内存中将要被更改的数据与期望的值做比较.当这两个值相等时,CPU才会将内存中的数值替换为新的值,否则便不做操作.最后,CPU 会将当前变量的真实值返回.这一系列的操作是原子的. CAS是一种乐观锁的思路,它相信在它修改之前,没有其它线程去修改它.而synchronized是一种悲观锁,它认

交换操作 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& l

swap与dd命令使用详解

处理交换文件和分区 交换分区是系统RAM 的补充 基本设置包括: 创建交换分区或者文件 使用mkswap 写入特殊签名 在/etc/fstab 文件中添加适当的条目 使用swapon -a 挂载交换分区 启用:swapon swapon [OPTION]... [DEVICE] -a :激活所有的交换分区: -p PRIORITY :指定优先级 /etc/fstab:pri=value 禁用:swapoff [OPTION]... [DEVICE] [[email protected] ~]#

Linux内存机制以及手动释放swap和内存

哇,感觉好久没更新了,今天我们来谈谈Linux的内存机制. 首先我们理一下概念 一.什么是linux的内存机制? 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念. 物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换