0

0

c++ swap函数用法_c++交换两个变量的值

穿越時空

穿越時空

发布时间:2026-01-23 13:59:14

|

182人浏览过

|

来源于php中文网

原创

std::swap是C++标准库中高效交换对象值的函数,定义在中,优先使用移动语义或位交换,避免深拷贝;直接赋值会导致数据丢失,手写临时变量冗余且不通用。

c++ swap函数用法_c++交换两个变量的值

std::swap 是什么,为什么不能直接用赋值

std::swap 是 C++ 标准库中用于交换两个对象值的函数,定义在 头文件里。它不是简单的三行赋值(临时变量 + a=b + b=临时),而是针对不同类型做了优化:对基础类型是位交换,对类类型会优先调用移动语义(如果可用),避免深拷贝开销。

直接写 a = b; b = a; 会导致 b 值丢失,这是初学者常见错误;而手写临时变量虽然可行,但冗余、易错,且无法自动适配自定义类型或容器。

基本用法:交换 int、double、string 等内置/标准类型

只要类型支持移动构造/赋值或拷贝构造/赋值,std::swap 就能用。注意必须显式包含头文件,否则编译报错 ‘swap’ was not declared in this scope

  • 不加 using std::swap; 时,必须写全名 std::swap(a, b)
  • std::arraystd::vector 等容器,std::swap 会交换内部指针(O(1) 时间),而不是逐个元素复制
  • 交换 const 对象?不行 —— std::swap 参数是左值引用,要求可修改
#include 
#include 

int main() { int a = 10, b = 20; std::swap(a, b); // ✅ 安全、高效 std::cout << a << " " << b << "\n"; // 输出: 20 10 }

自定义类怎么让 swap 更快:提供非成员 swap 重载

如果你的类管理动态资源(比如自己 new 的数组),默认的 std::swap 会触发拷贝构造 + 拷贝赋值,性能差还可能抛异常。正确做法是在类所在命名空间中定义非成员 swap 函数,并声明为 friend 或公有接口。

抖云猫AI论文助手
抖云猫AI论文助手

一款AI论文写作工具,最快 2 分钟,生成 3.5 万字论文。论文可插入表格、代码、公式、图表,依托自研学术抖云猫大模型,生成论文具备严谨的学术专业性。

下载

立即学习C++免费学习笔记(深入)”;

  • 不要在 std 命名空间里加东西(违反标准,未定义行为)
  • ADL(参数依赖查找)会让 std::swap(x, y) 自动找到你定义的 swap(MyClass&, MyClass&)
  • 函数体内应只做成员交换(用 std::swap 递归交换各字段),不分配新资源
struct Widget {
    int* data;
    Widget(int x) : data(new int(x)) {}
    ~Widget() { delete data; }
    // ... 拷贝/移动操作略
};

// 在 Widget 同一命名空间(全局)中定义 void swap(Widget& a, Widget& b) noexcept { std::swap(a.data, b.data); // 仅交换指针 }

常见陷阱:std::swap 与 ADL 冲突、右值引用误用

最隐蔽的问题是:你写了自定义 swap,但调用时没触发,还是走默认拷贝版。原因常是忘记 ADL 触发条件 —— 比如用了 using std::swap; 后又写 swap(a, b),编译器可能只找 std::swap 而忽略你的版本。

  • 安全写法:始终用 using std::swap; swap(a, b);(两行),靠 ADL 找到最优重载
  • 别对字面量或临时对象调用 std::swap:例如 std::swap(1, x) 编译失败(无法绑定非常量左值引用)
  • 容器的 swap 成员函数(如 v1.swap(v2))和 std::swap(v1, v2) 等价,但前者更明确,某些老编译器对后者 ADL 支持弱

真正复杂的地方在于:当类模板嵌套、继承关系存在时,swap 重载要覆盖所有可能组合,稍有遗漏就退化成低效拷贝 —— 这点很容易被忽略,直到压测时发现内存暴涨或卡顿。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

358

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1491

2023.10.24

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

527

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

358

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

542

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号