std::swap
提供: cppreference.com
ヘッダ <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およびそれ以降) | |
template<class T2, std::size_t N > void swap( T2 (&a)[N], T2 (&b)[N])noexcept(/* see below */); | (2) | (C++11およびそれ以降) |
指定された値を入れ替えます。
1) 値
a
と b
を入れ替えます。 このオーバーロードは std::is_move_constructible_v<T>&& std::is_move_assignable_v<T> が true でなければオーバーロード解決に参加しません。(C++17およびそれ以降)2) 配列
a
と b
を入れ替えます。 実質的に std::swap_ranges(a, a+N, b) です。 このオーバーロードは std::is_swappable_v<T2> が true でなければオーバーロード解決に参加しません。(C++17およびそれ以降)目次 |
[編集]引数
a, b | - | 入れ替えられる値 |
型の要件 | ||
-T は MoveAssignable , MoveConstructible の要件を満たさなければなりません。 | ||
-T2 は Swappable の要件を満たさなければなりません。 |
[編集]戻り値
(なし)
[編集]例外
1)
(なし) | (C++11以前) | |||||||||
noexcept 指定: (C++11およびそれ以降)
| (C++11およびそれ以降) |
2)
例外仕様の中の識別子 swap の名前探索は、通常の名前探索ルールによって発見されるものに加えて、この関数が発見されます。 C++17 の std::is_nothrow_swappable と同等の例外仕様になります。 | (C++17以前) |
(C++17およびそれ以降) |
[編集]計算量
1) 定数時間
2) N の線形時間
[編集]特殊化
std::swap はユーザ定義型に対して std 名前空間内で特殊化しても構いません。 しかしそのような特殊化は ADL で発見されません (std 名前空間はユーザ定義型に対して関連付けれらた名前空間ではありません)。 ユーザ定義型を swap 可能にする期待されている方法は、その型と同じ名前空間で非メンバ関数 swap を提供することです。 詳細は Swappable
を参照してください。
以下のオーバーロードが標準ライブラリによってすでに提供されています。
(C++11) | std::swap アルゴリズムの特殊化 (関数テンプレート) |
(C++11) | std::swap アルゴリズムの特殊化 (関数テンプレート) |
(C++11) | std::swap アルゴリズムの特殊化 (関数テンプレート) |
(C++11) | std::swap アルゴリズムの特殊化 (関数テンプレート) |
(C++11) | std::swap アルゴリズムの特殊化 (関数テンプレート) |
(C++11) | std::swap アルゴリズムの特殊化 (関数テンプレート) |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
(C++11) | std::swap アルゴリズムの特殊化 (関数テンプレート) |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
(C++11) | std::swap アルゴリズムの特殊化 (関数テンプレート) |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
(C++11) | std::swap アルゴリズムの特殊化 (関数テンプレート) |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
(C++11) | std::swap アルゴリズムの特殊化 (関数テンプレート) |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
(C++11) | std::swap アルゴリズムの特殊化 (関数テンプレート) |
(C++11) | unique_lock に対する std::swap の特殊化 (関数テンプレート) |
(C++11) | std::swap アルゴリズムの特殊化 (関数テンプレート) |
std::swap アルゴリズムの特殊化 (関数テンプレート) | |
(C++17) | std::swap アルゴリズムの特殊化 (関数) |
(C++17) | std::swap アルゴリズムの特殊化 (関数) |
(C++17) | std::swap アルゴリズムの特殊化 (関数) |
2つのパスを入れ替えます (関数) | |
[編集]例
出力:
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つのイテレータが指す要素を入れ替えます (関数テンプレート) | |
2つの範囲の要素を入れ替えます (関数テンプレート) | |