std::swap
#include <algorithm>
template <class T> void swap (T& a, T& b);
Hoán đổi giá trị của hai đối tượng.
Tham số
a
- Tham chiếu đến đối tượng thứ nhất.
b
- Tham chiếu đến đối tượng thứ hai.
Giá trị trả về
Không có giá trị trả về
Đặc điểm
swap()
yêu cầu các đối tượng có thể gán được (assignable) hoặc hỗ trợ move semantics (từ C++11).- Đối với các kiểu dữ liệu tự định nghĩa, bạn nên cung cấp hàm swap chuyên biệt (specialized swap function) trong lớp của mình để tối ưu hóa việc hoán đổi. Nhiều thư viện tiêu chuẩn, bao gồm
<algorithm>
và<utility>
đã định nghĩa các hàmswap()
chuyên biệt cho nhiều kiểu dữ liệu. Các hàmswap()
này thường được gọi bằng cơ chế Argument-Dependent Lookup (ADL). - Sử dụng std::swap thay vì tự viết hàm
swap()
riêng để tận dụng các tối ưu hóa và đảm bảo tính nhất quán. swap()
được sử dụng để hoán đổi giá trị của hai biến cùng kiểu. Nó hoạt động với hầu hết các kiểu dữ liệu, bao gồm các kiểu cơ bản (int
,float
,char
, ...), con trỏ, và các đối tượng của các lớp (class) tự định nghĩa, miễn là kiểu đó hỗ trợ phép gán (assignment operator) hoặc move semantics (từ C++11).- Trước C++11,
swap()
thường được triển khai bằng cách sử dụng một biến tạm:template <class T>
void swap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
} - Từ C++11,
swap()
tận dụng move semantics nếu kiểu dữ liệuT
hỗ trợ. Điều này cho phép hoán đổi các đối tượng một cách hiệu quả hơn bằng cách di chuyển tài nguyên thay vì sao chép:template <class T>
void swap(T& a, T& b) {
T temp = std::move(a);
a = std::move(b);
b = std::move(temp);
}
Ví dụ
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
int main() {
int x = 10;
int y = 20;
std::swap(x, y);
std::cout << "x: " << x << ", y: " << y << std::endl;
std::string str1 = "hello";
std::string str2 = "world";
std::swap(str1, str2);
std::cout << "str1: " << str1 << ", str2: " << str2 << std::endl;
std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2 = {4, 5, 6};
std::swap(vec1, vec2);
std::cout << "vec1: ";
for (int n : vec1) std::cout << n << " ";
std::cout << "\nvec2: ";
for (int n : vec2) std::cout << n << " ";
std::cout << std::endl;
return 0;
}
Các hàm liên quan
copy | Sao chép các phần tử từ một phạm vi (range) nguồn sang một phạm vi đích khác |
fill | Gán một giá trị cho tất cả các phần tử trong một phạm vi (range) được chỉ định |
replace | Thay thế tất cả các lần xuất hiện của một giá trị cũ bằng một giá trị mới trong một phạm vi (range) |