现在位置: 首页 > C++ 教程 > 正文

C++ <array> swap 函数

C++ 容器类 <array> C++ 容器类 <array>


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;
}

运行结果预期:

交换前:
a: 1 2 3 4 5
b: 10 20 30 40 50

交换后:
a: 10 20 30 40 50
b: 1 2 3 4 5

代码解析:

  1. a.swap(b) 交换 a 和 b 的内容。
  2. 交换后,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;
}

运行结果预期:

交换前:
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;
}

运行结果预期:

反转前: 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;
}

运行结果预期:

交换前 - data: 1 2 3 4 5
交换后 - data: 0 0 0 0 0

代码解析:

  • 由于 array 大小固定,无法真正删除元素,但可以与全零数组交换来"清空"内容。
  • 这在某些场景下可能有用。

C++ 容器类 <array> C++ 容器类 <array>