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 인 경우에만 오버로드 해결에 참여합니다.

(since C++17)
2) 배열 a b 를 교환합니다. std:: swap_ranges ( a, a + N, b ) 와 동등합니다.

이 오버로드는 std:: is_swappable_v < T2 > true 인 경우에만 오버로드 해결에 참여합니다.

(C++17부터)

목차

매개변수

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 는 사용자 정의 타입에 대해 std 네임스페이스에서 특수화 될 수 있지만, 이러한 특수화들은 ADL 에 의해 발견되지 않습니다 (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 배열을 교환할 수 없었음 오버로드 (2) 추가됨
LWG 2554 C++11 다차원 배열 교환 시 이름 검색 문제로 인해
noexcept 가 될 수 없었음
동작하도록 수정됨

참고 항목

두 객체의 값을 교환
(커스터마이제이션 포인트 객체)
두 반복자가 가리키는 요소를 교환
(함수 템플릿)
두 요소 범위를 교환
(함수 템플릿)
(C++14)
인수를 새 값으로 교체하고 이전 값을 반환
(함수 템플릿)