std::swap
std::swap (std::queue 특수화)
std::swap 알고리즘을 std::queue에 대해 특수화한 함수예요. 두 queue의 내용물을 서로 바꿔요. 내부적으로 lhs.swap(rhs)를 호출해요.
출처: cppreference
본문
<queue> 헤더에 정의돼 있고, std::queue용 swap 오버로드예요.
template< class T, class Container >
void swap( std::queue<T, Container>& lhs,
std::queue<T, Container>& rhs ); // (until C++17)
template< class T, class Container >
void swap( std::queue<T, Container>& lhs,
std::queue<T, Container>& rhs )
noexcept(/* see below */); // (since C++17)
lhs와 rhs의 내용물을 서로 바꿔요. 내부적으로 lhs.swap(rhs)를 호출해요. C++17부터 이 오버로드는 std::is_swappable_v<Container>가 true일 때만 오버로드 해석에 참여해요.
- 매개변수
lhs,rhs: 내용물을 바꿀 컨테이너 어댑터들. - 복잡도: 기본 컨테이너를 swap하는 것과 같아요.
- 예외 지정:
noexcept(noexcept(lhs.swap(rhs)))(C++17부터).
참고로 컨테이너 어댑터용 std::swap 오버로드가 C++11에 도입됐지만, C++98에서도 std::swap으로 어댑터를 이미 swap할 수 있었어요. 그런 호출은 보통 선형 시간 복잡도를 가지지만 더 나은 복잡도가 제공될 수도 있어요. 이 특수화는 어댑터 내부 컨테이너에 접근할 수 있으므로 더 효율적인 swap이 가능해요.
예제를 보면 swap 전후를 확인할 수 있어요.
#include <iostream>
#include <queue>
int main()
{
std::queue<int> a, b;
a.push(1); a.push(2); a.push(3);
b.push(7); b.push(8);
std::swap(a, b);
// 이제 a는 {7,8}, b는 {1,2,3}
std::cout << a.size() << ' ' << b.size() << '\n'; // 2 3
}