Nó an toàn vì không có gì được tạo ra trong quá trình trao đổi. Chỉ các thành viên dữ liệu của lớp std::vector
được hoán đổi.
Hãy xem xét chương trình trình diễn sau đây để làm rõ cách các đối tượng của lớp std::vector
được hoán đổi.
#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;
}
Đầu ra của chương trình là
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
Như bạn chỉ thấy các thành viên dữ liệu ptr
và n
được hoán đổi trong trao đổi chức năng thành viên. Không có tài nguyên bổ sung được sử dụng.
Một cách tiếp cận tương tự được sử dụng trong lớp std::vector
.
Ví dụ này
std::vector<Widget> WidgetVector;
std::vector<Widget2> Widget2Vector;
sau đó có các đối tượng của các lớp khác nhau. Việc hoán đổi hàm thành viên được áp dụng cho các vectơ cùng loại.