c++swap函数的用法
时间: 2024-06-17 22:06:54 浏览: 315
C++中的swap()函数是一个非常有用的函数,它可以交换两个变量的值。它的用法非常简单,只需要在函数中传递需要交换值的两个变量即可。
以下是swap()函数的用法示例:
```cpp
#include <iostream>
using namespace std;
int main() {
int x = 10;
int y = 20;
cout << "交换前,x 的值:" << x << endl;
cout << "交换前,y 的值:" << y << endl;
swap(x, y);
cout << "交换后,x 的值:" << x << endl;
cout << "交换后,y 的值:" << y << endl;
return 0;
}
```
输出结果为:
```
交换前,x 的值:10
交换前,y 的值:20
交换后,x 的值:20
交换后,y 的值:10
```
相关问题
c++ swap函数用法
### C++ `swap` 函数详解
#### 语法说明
在C++标准库中,`std::swap` 是一种通用工具函数模板,用于交换两个对象的值。此操作对于各种数据类型的对象均适用,包括基本类型以及自定义类的对象。
```cpp
namespace std {
template <class T>
void swap(T& a, T& b);
}
```
该模板接受两个同类型的左值引用作为参数,并将它们所指代的数据成员互换位置[^2]。
#### 实现方式对比
简单版本的 `swap` 函数可能会像这样编写:
```cpp
void simpleSwap(int &a, int &b){
int tmp = a;
a = b;
b = tmp;
}
```
然而,在现代C++实践中推荐使用STL提供的 `std::swap` 方法来处理不同类型间的交换需求。它不仅限于内置数值型态,还支持容器、字符串乃至复杂结构体等更广泛的情景下完成高效而安全的价值传递过程[^4]。
#### 完整示例程序展示
下面给出一段完整的代码片段用来演示如何利用 `std::swap` 对不同种类的数据项执行交换动作:
```cpp
#include <iostream>
using namespace std;
int main(){
// 基本类型之间的交换
int numA=1,numB=2;
cout << "Before swapping: A=" << numA << ", B="<<numB<<endl;
swap(numA,numB); // 调用全局命名空间下的swap
cout << "After swapping : A=" << numA << ", B="<<numB<<endl;
// 用户自定义类型之间也可以使用swap
struct Point{
double x,y;
friend ostream& operator<<(ostream&, const Point&);
void swap(Point&) noexcept;
};
Point p1{.x=3,.y=7},p2{.x=-8,.y=9};
cout<<"Points before:"<<p1<<","<<p2<<'\n';
p1.swap(p2);
cout<<"Points after :"<<p1<<","<<p2<<'\n';
return 0;
}
// 输出Point实例的方法
ostream& operator<<(ostream &os,const Point &pt){
os <<"{"<< pt.x<<','<<pt.y <<'}';
return os;
}
// 自定义swap方法实现
void Point::swap(Point &other)noexcept{
using std::swap;
swap(x , other.x );
swap(y , other.y );
}
```
这段代码展示了从简单的整数到较为复杂的用户定义类型(如这里的二维坐标点),都可以借助 `std::swap` 来轻松达成元素间值得转换目的。
c++swap函数
<<
`std::swap` 是 C++ 标准库提供的一种用于交换两个变量值的通用算法。
**一、使用方法**
1. **基本数据类型**
对于基本的数据类型(如 int, double等),可以直接调用 `std::swap` 函数进行交换操作:
```cpp
int a = 5;
int b = 10;
std :: swap(a,b);
//此时a=10;b=5;
```
2. **自定义类型的swap重载**
如果想要为自己的类或结构体也能够方便地使用 `std::swap` 进行成员属性之间的互换,则可以通过全局函数或者类内非静态成员函数的形式对该函数进行重载。通常来说,在 STL 容器中插入 自定义 类型 的对象时,编译器会自动选择合适的版本;但为了确保效率与正确性,我们还是建议用户自己去明确指定如何执行“元素间”内容上的替换行为。
例如以下这个简单的Person类的例子:
```cpp
class Person {
public:
string name;
int age;
private :
//...
};
void swap(Person& first , Person & second){
using std::swap; //引入命名空间中的模板化版本作为默认回退选项
swap(first.name ,second.name );
swap( first.age , second.age);
}
```
以上代码展示了怎样为包含字符串和其他内置数值字段的人类实体编写辅助工具程序以支持其内部状态信息间的相互转移功能.
**二、原理及实现机制**
实际上在很多标准库里边它的底层逻辑大概是这样的 :
- 创建临时副本 : 先把第一个参数所指代目标的内容复制到局部作用域下的新实例里.
- 移动赋值: 接着将第二个实参里的原始资料搬移到原先存放前者的位置上.
- 最后一步则是完成反向搬运动作——即让最初传入的那个被当作源端的对象接收下暂存区内的东西.
这样做虽然简单直接但也并非总是最优解法尤其是在处理大型复杂记录结构或是频繁涉及动态内存分配的情形下可能会带来不必要的开销因此部分优化后的变种形式采用了更巧妙的设计思路比如只交换指向实际存储地址的引用而非整个对象本体本身从而避免了重复拷贝带来的额外负担。
阅读全文
相关推荐
















