C++ <array> swap 函数
swap 是 array 中用于交换两个数组内容的函数,是非常有用的工具。
swap 是容器类的成员函数,用于交换两个 array 的内容。两个 array 必须是相同类型和相同大小。
swap 提供了高效交换两个容器内容的方式,是算法和数据结构实现中的常用工具。
单词释义: swap 表示"交换",即交换两个数组的内容。
基本语法与参数
swap 是容器类的成员函数,需要另一个 array 作为参数。
语法格式
void swap(array& other) noexcept;
参数说明
- 参数:
other- 类型:
array<T, N>&(相同类型的引用) - 描述: 要与之交换内容的另一个 array。两个 array 必须具有相同的元素类型和大小。
- 类型:
函数说明
- 返回值:
void(无返回值)。 - 效果: 交换两个 array 的所有元素。这是 O(n) 操作,需要逐元素交换。
- 注意:
swap通常被声明为noexcept,表示不会抛出异常。
实例
让我们通过一系列例子,彻底掌握 swap 的用法。
示例 1:基础用法 - 交换两个数组
实例
#include <iostream>
#include <array>
int main() {
std::array<int, 5> a = {1, 2, 3, 4, 5};
std::array<int, 5> b = {10, 20, 30, 40, 50};
std::cout << "交换前:" << std::endl;
std::cout << "a: ";
for(int n : a) std::cout << n << " ";
std::cout << std::endl;
std::cout << "b: ";
for(int n : b) std::cout << n << " ";
std::cout << std::endl;
// 交换两个数组
a.swap(b);
std::cout << "\n交换后:" << std::endl;
std::cout << "a: ";
for(int n : a) std::cout << n << " ";
std::cout << std::endl;
std::cout << "b: ";
for(int n : b) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
#include <array>
int main() {
std::array<int, 5> a = {1, 2, 3, 4, 5};
std::array<int, 5> b = {10, 20, 30, 40, 50};
std::cout << "交换前:" << std::endl;
std::cout << "a: ";
for(int n : a) std::cout << n << " ";
std::cout << std::endl;
std::cout << "b: ";
for(int n : b) std::cout << n << " ";
std::cout << std::endl;
// 交换两个数组
a.swap(b);
std::cout << "\n交换后:" << std::endl;
std::cout << "a: ";
for(int n : a) std::cout << n << " ";
std::cout << std::endl;
std::cout << "b: ";
for(int n : b) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
运行结果预期:
交换前: a: 1 2 3 4 5 b: 10 20 30 40 50 交换后: a: 10 20 30 40 50 b: 1 2 3 4 5
代码解析:
a.swap(b)交换 a 和 b 的内容。- 交换后,a 包含原来的 b 的值,b 包含原来的 a 的值。
示例 2:使用 std::swap
也可以使用 std::swap 函数来交换两个 array。
实例
#include <iostream>
#include <array>
#include <algorithm>
int main() {
std::array<int, 3> arr1 = {1, 2, 3};
std::array<int, 3> arr2 = {4, 5, 6};
std::cout << "交换前: " << std::endl;
std::cout << "arr1: ";
for(int n : arr1) std::cout << n << " ";
std::cout << std::endl;
// 使用 std::swap
std::swap(arr1, arr2);
std::cout << "交换后: " << std::endl;
std::cout << "arr1: ";
for(int n : arr1) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
#include <array>
#include <algorithm>
int main() {
std::array<int, 3> arr1 = {1, 2, 3};
std::array<int, 3> arr2 = {4, 5, 6};
std::cout << "交换前: " << std::endl;
std::cout << "arr1: ";
for(int n : arr1) std::cout << n << " ";
std::cout << std::endl;
// 使用 std::swap
std::swap(arr1, arr2);
std::cout << "交换后: " << std::endl;
std::cout << "arr1: ";
for(int n : arr1) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
运行结果预期:
交换前: arr1: 1 2 3 交换后: arr1: 4 5 6
代码解析:
std::swap(arr1, arr2)同样可以交换两个 array。- 效果与调用成员函数
swap相同。
示例 3:反向数组
可以使用 swap 来实现数组的反转。
实例
#include <iostream>
#include <array>
#include <algorithm>
int main() {
std::array<int, 5> numbers = {1, 2, 3, 4, 5};
std::cout << "反转前: ";
for(int n : numbers) std::cout << n << " ";
std::cout << std::endl;
// 使用两个指针进行交换来反转
auto left = numbers.begin();
auto right = numbers.end() - 1;
while(left < right) {
std::swap(*left, *right);
++left;
--right;
}
std::cout << "反转后: ";
for(int n : numbers) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
#include <array>
#include <algorithm>
int main() {
std::array<int, 5> numbers = {1, 2, 3, 4, 5};
std::cout << "反转前: ";
for(int n : numbers) std::cout << n << " ";
std::cout << std::endl;
// 使用两个指针进行交换来反转
auto left = numbers.begin();
auto right = numbers.end() - 1;
while(left < right) {
std::swap(*left, *right);
++left;
--right;
}
std::cout << "反转后: ";
for(int n : numbers) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
运行结果预期:
反转前: 1 2 3 4 5 反转后: 5 4 3 2 1
代码解析:
- 使用首尾指针和
std::swap可以实现数组反转。 - 这是手动实现的反转算法。
示例 4:清空数组
可以与空数组交换来达到清空的效果(虽然 array 大小固定,但可以交换内容)。
实例
#include <iostream>
#include <array>
int main() {
std::array<int, 5> data = {1, 2, 3, 4, 5};
std::array<int, 5> empty = {};
std::cout << "交换前 - data: ";
for(int n : data) std::cout << n << " ";
std::cout << std::endl;
// 与空数组交换
data.swap(empty);
std::cout << "交换后 - data: ";
for(int n : data) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
#include <array>
int main() {
std::array<int, 5> data = {1, 2, 3, 4, 5};
std::array<int, 5> empty = {};
std::cout << "交换前 - data: ";
for(int n : data) std::cout << n << " ";
std::cout << std::endl;
// 与空数组交换
data.swap(empty);
std::cout << "交换后 - data: ";
for(int n : data) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
运行结果预期:
交换前 - data: 1 2 3 4 5 交换后 - data: 0 0 0 0 0
代码解析:
- 由于 array 大小固定,无法真正删除元素,但可以与全零数组交换来"清空"内容。
- 这在某些场景下可能有用。

C++ 容器类 <array>