直接交换指针是o(1)操作,比std::swap_ranges或手动循环的o(n)快得多;前提是数组通过指针访问(如int a、int b),且生命周期足够长(全局/静态/堆内存),原生数组名不可赋值,需用std::array或raii容器实现高效交换。

直接交换指针比拷贝数组快得多
只要两个数组类型相同、生命周期足够长(比如都是全局/静态/堆上分配),就根本不用逐个元素复制——只需交换它们的首地址。这是 O(1) 操作,而 std::swap_ranges 或手动循环是 O(n)。
用 std::swap 交换指针变量本身
前提是你的“数组”是通过指针访问的(比如 int* a 和 int* b),而不是原生数组(如 int a[10])。原生数组名不可赋值,不能直接交换。
实操建议:
- 声明时用指针:确保
a和b是指向堆或静态内存的int*类型 - 别对栈数组取地址后交换:比如
int x[5], y[5]; int* p = x; int* q = y;可以交换p和q,但不会影响x和y本身的布局 - 示例:
int* a = new int[1000]; int* b = new int[1000]; // ... 初始化 ... std::swap(a, b); // 现在 a 指向原来 b 的内存,反之亦然
原生数组怎么办?得用引用或封装
如果必须处理 int arr1[100] 和 int arr2[100] 这类固定大小数组,C++ 不允许直接交换它们,因为数组名不是左值。常见错误是试图写 std::swap(arr1, arr2),编译器会报错:error: cannot bind non-const lvalue reference to an array。
可行方案:
- 用
std::array<int></int>替代:支持std::swap,内部只交换指针或元数据,不拷贝元素 - 用引用包装:
using Arr = int(&)[100];,再写一个交换函数(但实际仍需 memcpy,不算真正“高效交换”) - 最简做法:把原生数组包进结构体,然后交换结构体(依赖编译器优化,通常能避免拷贝)
别忘了所有权和生命周期
交换指针只是交换地址,不改变内存归属。容易踩的坑:
- 交换后忘记更新对应的
delete[]对象,导致释放错误内存或重复释放 - 其中一个指针指向栈内存(如
&local_var),交换后用delete[]崩溃 - 使用 RAII 容器(如
std::vector)更安全:std::swap(vec1, vec2)是标准推荐做法,内部也做指针交换
真正高效的交换,核心是避免数据搬移;但一旦涉及内存管理责任,清晰的归属比省几纳秒更重要。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











