스왑 작업 중에 아무 것도 생성되지 않으므로 안전합니다. 클래스의 데이터 멤버 만 std::vector
교체됩니다.
클래스의 객체가 어떻게 std::vector
교체 되는지 명확하게 보여주는 다음과 같은 실증 프로그램을 고려하십시오 .
#include <iostream>
#include <utility>
#include <iterator>
#include <algorithm>
#include <numeric>
class A
{
public:
explicit A( size_t n ) : ptr( new int[n]() ), n( n )
{
std::iota( ptr, ptr + n, 0 );
}
~A()
{
delete []ptr;
}
void swap( A & a ) noexcept
{
std::swap( ptr, a.ptr );
std::swap( n, a.n );
}
friend std::ostream & operator <<( std::ostream &os, const A &a )
{
std::copy( a.ptr, a.ptr + a.n, std::ostream_iterator<int>( os, " " ) );
return os;
}
private:
int *ptr;
size_t n;
};
int main()
{
A a1( 10 );
A a2( 5 );
std::cout << a1 << '\n';
std::cout << a2 << '\n';
std::cout << '\n';
a1.swap( a2 );
std::cout << a1 << '\n';
std::cout << a2 << '\n';
std::cout << '\n';
return 0;
}
프로그램 출력은
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4 5 6 7 8 9
당신은 단지 데이터 멤버를 참조로 ptr
하고 n
멤버 함수 스왑으로 교체된다. 추가 리소스가 사용되지 않습니다.
비슷한 접근법이 클래스에서 사용됩니다 std::vector
.
이 예는
std::vector<Widget> WidgetVector;
std::vector<Widget2> Widget2Vector;
다른 클래스의 객체가 있습니다. 멤버 함수 스왑은 동일한 유형의 벡터에 적용됩니다.