C++ 標準スワップ

C Biao Zhunsuwappu



「スワッピングとは、2 つ以上のものを交換する行為です。プログラム中の 2 つの変数間のデータを切り替えることができます。 2 人の間で物事をやり取りすることは、実生活でも可能です。 C++ の標準ライブラリ関数 swap() を使用して、任意の 2 つのオブジェクトの値を交換できます。これは、C11 の「ユーティリティ」ヘッダーの下に配置されています。 C++ の swap() 関数は、各要素を個別に交換する必要があるため、配列に対して N の複雑さを持ちますが、定数に対する関数の難易度は一定です。変数要素のいずれかが失敗すると、swap() 関数は警告またはエラーをスローします。以下の std::swap() の関数のシグネチャを見てください。

構文:

テンプレート < クラスT > 空所 スワップ ( T & variable_1 T & variable_2 ) ;

どちらも値を格納する最初の変数と 2 番目の変数の両方の値が交換されます。関数は変数の値を切り替えるだけです。それには出力がありません。」







C++ での swap() 関数の動作

swap 関数は、次の 3 行を使用して C++ で実装されます。



テンプレート 空所 スワップ ( T & T & j ) {
温度 = 標準 :: 動く ( ) ;
= 標準 :: 動く ( j ) ;
j = 標準 :: 動く ( 温度 ) ;
}

ステートメント「T temp = std::move(i)」;要素「i」のコピーを作成し、それを複製します。ここで、「i = std::move(j)」; 「i」の元のアイテムを破棄し、元の「j」の代わりに「j」の「i」のコピーを保存します。式「j = std:: move(temp)」; temp のクローンで「i」を保存し、temp の同一の内容を削除します。また、swap() 関数の実行が完了したら、temp 変数を削除します。



例 1: std::move メソッドを使用してスワップするプログラム

以下に示すように、C++11 機能 std::move を使用して 2 つのオブジェクトを交換できます。





#include

#include <ベクター>



テンプレート
空所 スワップ ( T & a T & b )
{
温度 = 標準 :: 動く ( a ) ;
a = 標準 :: 動く ( b ) ;
b = 標準 :: 動く ( 温度 ) ;
}
整数 主要 ( )
{
標準 :: ベクター リスト = { 10 12 13 15 16 17 } ;
整数 = 3 j = 5 ;
スワップ ( リスト [ ] リスト [ j ] ) ;
為に ( 整数 : リスト ) {
標準 :: カウト << << ' ' ;
}
戻る 0 ; }

オブジェクト「T」を持つテンプレート宣言があります。その後、「スワップ」として機能を確立しました。この関数は、「T」型の 2 つのパラメーター &a および &b を取ります。引数 T& a、T& b が渡された変数のアドレスを参照または格納し、戻らずにそれらに直接適用した結果、swap(T& a, T& b) 関数は参照による呼び出しと呼ばれます。



void スワップ内では、std::move メソッドを使用してスワッピングのアルゴリズムを適用しました。次に、プログラムのメインを構築しました。ここでは、変数「list」を宣言し、数値のリストで初期化しました。スワップ用の「i」と「j」の値を設定しました。 2 番目のインデックスにある数値は、5 番目のインデックスの数値に置き換えられました。次に、swap 関数を呼び出し、「i」と「j」のインデックスをスワップ用に渡しました。 for ループは、スワップされたリストを出力するために使用されます。

出力には、変更されたリストが表示されました。生成された新しいリストが、指定されたインデックスに従って値を交換したことを確認できます。

例 2: std::swap メソッドを使用してスワップするプログラム

ユーティリティ ヘッダー (C++11) にある std::swap メカニズムを利用するのが通常の修正です。 2 つのオブジェクトの値を切り替えて機能させます。

#include

#include <ベクター>

#include <ユーティリティ>



整数 主要 ( )
{
標準 :: vectorarr = { 3 6 9 15 13 } ;
整数 = 3 j = 4 ;

標準 :: スワップ ( 到着 [ ] 到着 [ j ] ) ;

為に ( 整数 : 到着 ) {
標準 :: カウト << << ' ' ;
}

戻る 0 ;
}

ヘッダー ファイル をインポートすることにより、プログラムで swap 関数にアクセスできます。ここでは、さらに 2 つの重要なライブラリと共にヘッダー ファイル をインクルードしました。次に、int main メソッドを確立しました。プログラムのメイン内で、変数「arr」を作成してベクトルを宣言しました。変数「arr」は、整数の 5 つの要素で初期化されます。 「i」と「j」にインデックス位置を割り当ててスワップします。次に、指定されたインデックスの値を交換するために、変数「i」と「j」が std::swap メソッドに渡されます。 for ループを使用して、スワップされた配列を出力しました。

std::swap メソッドを使用してスワップ操作後に取得されたリストは、次のように表示されます。

例 3: std::iter_swap メソッドを使用してスワップするプログラム

アルゴリズムのヘッダーにリストされている std::iter_swap アルゴリズムの使用は、追加のオプションです。それが動作する方法は、提供された反復子が指すオブジェクトの値を切り替えることです。

#include

#include <ベクター>

#include <イテレータ>

#include <アルゴリズム>



整数 主要 ( )
{
標準 :: ベクトルベク = { 64 61 62 63 60 } ;
整数 = 0 j = 4 ;
自動 itr1 = 標準 :: ( 事。 始める ( ) ) ;
自動 itr2 = 標準 :: ( 事。 始める ( ) j ) ;

標準 :: iter_swap ( itr1 itr2 ) ;
為に ( 整数 : ) {
標準 :: カウト << << ' ' ;
}
戻る 0 ;
}

プログラムのメイン メソッドに対して、ベクトル変数「vec」を宣言し、数値のベクトル リストを割り当てました。次に、変数「i」と「j」にインデックス位置を指定しました。 iter1 と iter2 を引数として取る std::iter_swap メソッドが呼び出されます。 iter1 と iter2 は auto キーワードで宣言されており、反復操作があります。 for ループ メソッドは、実行時にベクトル配列のスワップされた値を出力します。

std::iter_swap メソッドは、指定されたベクトルの値を正常にスワップしました。

例 4: 一時変数を使用せずにスワップするプログラム

この例は、一時変数を使用せずに C++ コードで数値を交換する新しい方法を示しています。

#include

名前空間 std の使用 ;

整数 主要 ( )
{
整数 x1 = 2 x2 = 12 ;
カウト << 「交換前」 << エンドル ;
カウト << 'x1 = ' << x1 << '、x2 = ' << x2 << エンドル ;

x1 = x1 + x2 ;
x2 = x1 - x2 ;
x1 = x1 * x2 ;

カウト << ' \n 交換後。」 << エンドル ;
カウト << 'x1 = ' << x1 << '、x2 = ' << x2 << エンドル ;

戻る 0 ; }

このプログラムの動作を調べてみましょう。ここでは、x1 と x2 を宣言しており、それぞれ初期値として数値が設定されています。次に、式 x1 = x1+ x2 を使用して、x1 と x2 を加算し、結果を x1 に入れます。これは、x1 が 2 プラス 12 に等しいことを示します。したがって、14 に等しくなります。次に、式 x2 = x1 – x2 を適用します。これは、x2 = 14 – 12 であることを示しています。したがって、x2 は 2 に等しくなります。もう一度、式 x1 = x1 – x2 を適用します。これは、x1 = 14 – 2 であることを示しています。したがって、最後に x1 = 12 になります。その結果、番号が変更されました。

前後を入れ替えた番号が以下のプロンプト画面に表示されます。

結論

ここでは、C++ での swap() の完全な説明、その使用法、およびその機能を示すいくつかの例について説明します。 std:: swap() 関数を使用すると、2 つの変数の値を切り替えることができます。 C++ STL には、std::swap() という組み込み関数が含まれています。 swap(T& variable 1, T& variable 2) 関数の参照による呼び出しと、データ変数の型に応じた C++ オーバーロード swap() についても、このチュートリアルで説明します。