std::swap
| ヘッダ <algorithm>
|
(C++11まで) |
|
| ヘッダ <utility>
|
(C++11以上) |
|
| ヘッダ <string_view>
|
||
template< class T >
void swap( T& a, T& b );
|
(1) | (C++11から条件付きでnoexcept) (C++20からconstexpr) |
template< class T2, std::size_t N >
void swap( T2 (&a)[N], T2 (&b)[N] );
|
(2) | (C++11から条件付きでnoexcept) (C++20からconstexpr) |
与えられた値を交換します。
a と b を交換します。
|
このオーバーロードは、 |
(C++17以上) |
a と b を交換します。std::swap_ranges(a, a + N, b) と同等です。
|
このオーバーロードは、 |
(C++17以上) |
パラメータ
| a, b | - | 交換する値 |
| 型要件 | ||
-
T
は以下の要件を満たさなければならない:
CopyConstructible
および
CopyAssignable
(C++11以前)
MoveConstructible
および
MoveAssignable
(C++11以降)
。
|
||
-
T2
は
Swappable
の要件を満たさなければならない。
|
||
戻り値
(なし)
例外
|
(なし) |
(C++11まで) |
|
noexcept
仕様:
noexcept
(
std::
is_nothrow_move_constructible
<
T
>
::
value
&&
|
(C++11以降) |
|
noexcept
仕様:
例外仕様内での識別子
noexcept
(
noexcept
(
swap
(
*
a,
*
b
)
)
)
swap
の検索は、通常の検索規則で見つかるものに加えて、この関数テンプレートも見つけ、例外仕様をC++17の
std::is_nothrow_swappable
と同等にします。
|
(C++11以降)
(C++17まで) |
|
noexcept
仕様:
noexcept
(
std::
is_nothrow_swappable_v
<
T2
>
)
|
(C++17以降) |
計算量
特殊化
|
|
(C++20以前) |
プログラム定義型をスワップ可能にする標準的な方法は、その型と同じ名前空間で非メンバ関数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
アルゴリズムを特殊化
(関数テンプレート) |
|
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++20)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++23)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++14)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++17)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++17)
|
std::swap
アルゴリズムを特殊化
(関数) |
|
(C++17)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
(C++17)
|
std::swap
アルゴリズムを特殊化
(関数) |
|
(C++23)
|
std::swap
アルゴリズムを特殊化
(関数) |
|
(C++20)
|
std::swap
アルゴリズムを特殊化
(関数) |
|
(C++23)
|
std::swap
アルゴリズムを特殊化する
(関数) |
|
(C++20)
|
std::swap
アルゴリズムを特殊化
(関数) |
|
(C++20)
|
std::swap
アルゴリズムを特殊化
(関数) |
例
#include <algorithm> #include <iostream> namespace Ns { class A { int id {}; friend void swap(A& lhs, A& rhs) { std::cout << "swap(" << lhs << ", " << rhs << ")\n"; std::swap(lhs.id, rhs.id); } friend std::ostream& operator<<(std::ostream& os, A const& a) { return os << "A::id=" << a.id; } public: A(int i) : id {i} {} A(A const&) = delete; A& operator = (A const&) = delete; }; } int main() { int a = 5, b = 3; std::cout << a << ' ' << b << '\n'; std::swap(a, b); std::cout << a << ' ' << b << '\n'; Ns::A p {6}, q {9}; std::cout << p << ' ' << q << '\n'; // std::swap(p, q); // エラー、型要件が満たされない swap(p, q); // OK、ADLが適切なfriend `swap`を見つける std::cout << p << ' ' << q << '\n'; }
出力:
5 3 3 5 A::id=6 A::id=9 swap(A::id=6, A::id=9) A::id=9 A::id=6
欠陥報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 227 | C++98 |
T
は
CopyConstructible
または
DefaultConstructible
であることが要求されていなかった
(型
T
の一時オブジェクトが構築できない可能性があった)
|
T
は
CopyConstructible であることも要求される |
| LWG 809 | C++98 | 配列をswapできなかった | オーバーロード (2) を追加 |
| LWG 2554 | C++11 |
多次元配列のswapは名前探索の問題により
常に noexcept にならなかった |
動作するように修正 |
関連項目
(C++20) |
2つのオブジェクトの値を交換する (カスタマイゼーションポイントオブジェクト) |
| 2つのイテレータが指す要素を交換する (関数テンプレート) | |
| 2つの範囲の要素を交換する (関数テンプレート&アルゴリズム関数オブジェクト) | |
(C++20) |
|
(C++14) |
引数を新しい値で置き換え、その以前の値を返す (関数テンプレート) |