C++ <array> swap 関数

C++ 容器类 <array>C++ コンテナクラス <array>


swapは array 内で使用される2つの配列の内容を交換する関数であり、非常に便利なツールです。

swapコンテナクラスのメンバ関数であり、2つのarrayの内容を交換するために使用します。2つのarrayは同じ型で同じサイズでなければなりません。

swap2つのコンテナの内容を効率的に交換する方法を提供し、アルゴリズムやデータ構造の実装でよく使われるツールです。

単語の意味: swap「交換」を意味し、2つの配列の内容を交換します。


基本構文とパラメータ

swapコンテナクラスのメンバ関数であり、もう1つのarrayをパラメータとして必要とします。

構文形式

void swap(array& other) noexcept;

パラメータの説明

  • パラメータ: other
    • 型:array<T, N>&(同じ型の参照)
    • 説明: 内容を交換する相手のarray。2つのarrayは同じ要素型とサイズを持つ必要があります。

関数の説明

  • 戻り値: void(戻り値なし)。
  • 効果: 2つのarrayのすべての要素を交換します。これはO(n)操作であり、要素ごとに交換する必要があります。
  • 注意: swap通常は宣言されますnoexcept、例外を投げないことを示します。

例

一連の例を通して、しっかりと習得しましょうswapの使い方。

例1:基本的な使い方 - 2つの配列を交換する

例

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

    // 2つの配列を交換
    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関数を使って2つの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)同様に2つの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;

    // 2つのポインタを使って交換し反転
    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>

その他の拡張