Namespaces
Variants

std:: swap

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
定義先ヘッダ <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)

与えられた値を交換します。

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以降)

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - HTMLタグ、属性、
タグ内のテキストは翻訳していません
- C++固有の用語(Parameters、Return value、Exceptions、Complexity、Specializations、Example、Defect reports、See also)は原文のまま保持しています
- 書式と構造は完全に保持されています

パラメータ

a, b - 交換する値
型要件
-
T は以下の要件を満たさなければならない: CopyConstructible および CopyAssignable (C++11以前) MoveConstructible および MoveAssignable (C++11以降)
-
T2 Swappable の要件を満たさなければならない。

戻り値

(なし)

例外

1)

(なし)

(C++11まで)
(C++11以降)
2)
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以降)

計算量

1) 定数。
2) N に対して線形。

特殊化

std::swap はプログラム定義型に対して namespace std で特殊化 することができるが、そのような特殊化は ADL によって発見されない(namespace std はプログラム定義型の関連名前空間ではない)。

(C++20以前)

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

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

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 アルゴリズムを特殊化
(関数テンプレート)
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 アルゴリズムを特殊化
(関数テンプレート)
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 アルゴリズムを特殊化
(関数テンプレート)
std::swap アルゴリズムを特殊化する
(関数テンプレート)
std::swap アルゴリズムを特殊化
(関数テンプレート)
std::swap アルゴリズムを特殊化
(関数テンプレート)
std::swap アルゴリズムを特殊化
(関数)
std::swap アルゴリズムを特殊化する
(関数テンプレート)
std::swap アルゴリズムを特殊化する
(関数テンプレート)
std::swap アルゴリズムを特殊化
(関数)
std::swap アルゴリズムを特殊化
(関数)
std::swap アルゴリズムを特殊化
(関数)
std::swap アルゴリズムを特殊化する
(関数)
std::swap アルゴリズムを特殊化
(関数)
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 にならなかった
動作するように修正

関連項目

2つのオブジェクトの値を交換する
(カスタマイゼーションポイントオブジェクト)
2つのイテレータが指す要素を交換する
(関数テンプレート)
2つの範囲の要素を交換する
(関数テンプレート)
(C++14)
引数を新しい値で置き換え、以前の値を返す
(関数テンプレート)