第三个变量
实现
1 2 3 4 5 6 |
void swap(int &a, int &b) { int temp = a; // 将 a 的值存储在临时变量 temp 中 a = b; // 将 b 的值赋给 a b = temp; // 将 temp 中的原始 a 的值赋给 b } |
优点
- 简单易懂,逻辑清晰
缺点
- 需要额外的空间来存储临时变量
异或运算
实现
1 2 3 4 5 |
void swap(int &a, int &b) { a = a ^ b; // 第一步:a = a XOR b b = a ^ b; // 第二步:b = (a XOR b) XOR b = a a = a ^ b; // 第三步:a = (a XOR b) XOR a = b } |
优点
- 不需要额外的空间
- 运算只使用基本的逻辑运算,适用于底层硬件编程
缺点
- 对大多数程序员来说,这种方法不如使用第三个变量的方式直观,容易引起误解
- 如果
a
和b
是同一个变量,这种方法会导致数值变为0
,产生错误- 第一步
a
等于0
- 第二步
b
没发生改变 - 第三步
a
恢复原来的值
- 第一步
加减法
实现
1 2 3 4 5 |
void swap(int &a, int &b) { a = a + b; // 第一步:a = a + b b = a - b; // 第二步:b = (a + b) - b = a a = a - b; // 第三步:a = (a + b) - a = b } |
优点
- 不需要额外的空间
- 逻辑相对简单
缺点
- 如果
a
和b
的值过大,可能会导致溢出问题,因此这种方法在处理大整数时不安全 - 同样,如果
a
和b
是同一个变量,这种方法也会导致错误
乘除法
实现
1 2 3 4 5 |
void swap(int &a, int &b) { a = a * b; // 第一步:a = a * b b = a / b; // 第二步:b = (a * b) / b = a a = a / b; // 第三步:a = (a * b) / a = b } |
优点
- 不需要第三个变量
缺点
- 需要注意
b
不能为零,因为除数为零会导致错误 - 可能会导致溢出问题,尤其是当
a
和b
的值很大时
STL std::swap
实现
1 2 3 4 5 |
#include <algorithm> void swap(int &a, int &b) { std::swap(a, b); } |
优点
- 简单且易于理解
- 不容易出错,使用标准库函数也更符合现代
C++
编程风格
缺点
- 没有明显的缺点,除非你不能使用标准库
内联汇编(在特定平台下)
实现
1 2 3 |
void swap(int &a, int &b) { asm("xchg %0, %1" : "=r"(a), "=r"(b) : "0"(a), "1"(b)); } |
优点
- 可能在某些平台上更加高效
缺点
- 可移植性差,不适用于所有平台和编译器
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 贪心算法06/29
- ♥ 匹配_朴素字符串匹配算法10/14
- ♥ 匹配_KMP模式匹配算法:二10/09
- ♥ 搜索与图论模板03/09
- ♥ 基础算法模板03/09
- ♥ 查找_二分查找05/09