C++ <array> swap 関数
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;
}
#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
コードの解説:
a.swap(b)a と b の内容を交換します。- 交換後、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;
}
#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;
}
#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;
}
#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>