C/C++ Swap without using extra variable

本文介绍了两种交换两个整数变量的方法:一种是传统的使用临时变量的方法;另一种是不使用临时变量的方法,但需要注意可能产生的溢出问题。


本系列文章由 @YhL_Leo 出品,转载请注明出处。
文章链接: http://blog.csdn.net/yhl_leo/article/details/50255379


对于可以线性运算的变量,交换两个变量值的做法,通常我们是这样的:

/**
* Swap the parameters with a temp variable.
* @param a The first parameter.
* @param a The second parameter.
*/
void swap(int& a, int& b)
{
    int temp = a;
    a = b;
    b = temp;
}

稍作变化,就可以不通过临时变量实现:

/**
* Swap the parameters without a temp variable.
* Warning! Susceptible to overflow/underflow.
* @param a The first parameter.
* @param a The second parameter.
*/
void swapNoTemp(int& a, int& b)
{
    a -= b;      // a = a - b
    b += a;      // b = b + (a - b), b gets the original value of a
    a = (b - a); // a = a - (a - b), a gets the original value of b
}
### C 和 C++交换两个变量的方法 #### 使用临时变量的传统方法 在C和C++中,最常见的方式是使用一个额外的临时变量来完成两数之间的交换操作。 对于C语言: ```c void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } ``` 这段代码展示了如何定义并实现`swap`函数[^1]。此方式简单直观,在许多情况下都适用。 而对于C++来说,除了上述传统做法外还有更简洁高效的途径可供选择。 #### 利用标准库中的 `std::swap` 现代C++提供了内置于STL的标准模板库函数——`std::swap()`来进行数据成员间的互换工作,它不仅限于基本类型而且支持自定义类对象间的安全转换。 ```cpp #include <utility> // 导入 std::swap 所需头文件 // 对基础类型的交换 int main() { int x = 5, y = 10; std::swap(x, y); // 输出结果验证 printf("After swapping: %d %d\n", x, y); return 0; } ``` 得注意的是,当涉及到复杂的数据结构比如容器时,应该遵循C++核心准则C.84指出的原则:`swap` 函数不应抛出异常,因为这可能会影响依赖该特性的其他组件正常运作[^3]。 另外,如果想要创建自己的可移植版本,则可以通过引用传递参数从而避免不必要的复制开销;同时利用右引用特性进一步优化性能表现。 #### 自定义泛型Swap函数(适用于C++) ```cpp template<typename T> void generic_swap(T& a, T& b){ T tmp(std::move(a)); a=std::move(b); b=std::move(tmp); } struct NonTrivialType{ /* ... */ }; NonTrivialType objA{},objB{}; generic_swap(objA,objB); ``` 这里展示了一个通用化的`generic_swap`模板函数,它可以处理任意具有移动语义的对象实例,并且能够有效减少资源占用率以及提高执行效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值