Namespaces
Variants

std::swap

cppreference.net에서
 
 
알고리즘 라이브러리
제약된 알고리즘 및 범위에 대한 알고리즘 (C++20)
제약된 알고리즘, 예: ranges::copy, ranges::sort, ...
정렬 및 관련 연산
분할 연산
(C++11)    

정렬 연산
이진 검색 연산
(분할된 범위에 대해)
집합 연산 (정렬된 범위에 대해)
병합 연산 (정렬된 범위에 대해)
힙 연산
최소/최대 연산
(C++11)
(C++17)
사전식 비교 연산
순열 연산


 
헤더 <algorithm>
에 정의됨 (C++11까지)
헤더 <utility>
에 정의됨 (C++11부터)
template< class T >
void swap( T& a, T& b );
에 정의됨 (1) (조건부 noexcept, C++11부터)
(constexpr, C++20부터)
template< class T2, std::size_t N >
void swap( T2 (&a)[N], T2 (&b)[N] );
(2) (조건부 noexcept, C++11부터)
(constexpr, C++20부터)

주어진 값들을 교환합니다.

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 는 다음 요구사항을 충족해야 함: 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)
인수를 새 값으로 교체하고 이전 값을 반환합니다
(함수 템플릿)