名前空間
変種
操作

std::swap

提供: cppreference.com
< cpp‎ | algorithm
 
 
アルゴリズムライブラリ
実行ポリシー (C++17)
非変更シーケンス操作
(C++11)(C++11)(C++11)
(C++17)
変更シーケンス操作
未初期化記憶域の操作
分割操作
ソート操作
(C++11)
二分探索操作
集合操作 (ソート済み範囲用)
ヒープ操作
(C++11)
最小/最大演算
(C++11)
(C++17)
順列
数値演算
C のライブラリ
 
ヘッダ <algorithm> で定義
ヘッダ <utility> で定義
(C++11未満)
(C++11以上)
(1)
template< class T >
void swap( T& a, T& b );
(C++11未満)
template< class T >
void swap( T& a, T& b ) noexcept(/* see below */);
(C++11以上)
(C++20未満)
template< class T >
constexpr void swap( T& a, T& b ) noexcept(/* see below */);
(C++20以上)
(2)
template< class T2, std::size_t N >
void swap( T2 (&a)[N], T2 (&b)[N]) noexcept(/* see below */);
(C++11以上)
(C++20未満)
template< class T2, std::size_t N >
constexpr void swap( T2 (&a)[N], T2 (&b)[N]) noexcept(/* see below */);
(C++20以上)

指定された値を入れ替えます。

1)ab を入れ替えます。 このオーバーロードは std::is_move_constructible_v<T> && std::is_move_assignable_v<T>true でなければオーバーロード解決に参加しません。 (C++17以上)
2) 配列 ab を入れ替えます。 実質的に std::swap_ranges(a, a+N, b) です。 このオーバーロードは std::is_swappable_v<T2>true でなければオーバーロード解決に参加しません。 (C++17以上)

目次

[編集] 引数

a, b - 入れ替えられる値
型の要件
-
TMoveAssignable および MoveConstructible の要件を満たさなければなりません。
-
T2Swappable の要件を満たさなければなりません。

[編集] 戻り値

(なし)

[編集] 例外

1)

(なし)

(C++11未満)
noexcept 指定:  
noexcept(

    std::is_nothrow_move_constructible<T>::value &&
    std::is_nothrow_move_assignable<T>::value

)
(C++11以上)
2)
noexcept 指定:  
noexcept(noexcept(swap(*a, *b)))
例外仕様の中の識別子 swap の名前探索は、通常の名前探索ルールによって発見されるものに加えて、この関数が発見されます。 C++17 の std::is_nothrow_swappable と同等の例外仕様になります。
(C++17未満)
noexcept 指定:  
(C++17以上)

[編集] 計算量

1) 定数時間
2) N の線形時間

[編集] 特殊化

std::swap はプログラム定義型に対して std 名前空間内で特殊化しても構いません。 しかしそのような特殊化は ADL で発見されません (std 名前空間はプログラム定義型に対して関連付けれらた名前空間ではありません)。

(C++20未満)

プログラム定義型を swap 可能にする期待されている方法は、その型と同じ名前空間で非メンバ関数 swap を提供することです。 詳細は Swappable を参照してください。

以下のオーバーロードが標準ライブラリによってすでに提供されています。

std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
unique_lock に対する std::swap の特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::swap アルゴリズムの特殊化
(関数) [edit]
std::swap アルゴリズムの特殊化
(関数) [edit]
std::swap アルゴリズムの特殊化
(関数) [edit]
2つのパスを入れ替えます
(関数) [edit]

[編集]

#include <algorithm>
#include <iostream>
 
int main()
{
   int a = 5, b = 3;
 
   // before
   std::cout << a << ' ' << b << '\n';
 
   std::swap(a,b);
 
   // after
   std::cout << a << ' ' << b << '\n';
}

出力:

5 3
3 5

[編集] 不具合報告

以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。

DR 適用先 発行時の動作 正しい動作
LWG 2554 C++11 swapping multi-dimensional arrays can never be noexcept due to name lookup problems made to work

[編集] 関連項目

2つのイテレータが指す要素を入れ替えます
(関数テンプレート) [edit]
2つの範囲の要素を入れ替えます
(関数テンプレート) [edit]
(C++14)
引数を新しい値で置き換え、その以前の値を返します
(関数テンプレート) [edit]