×

Hoán đổi giá trị giữa hai biến với std::swap() trong C++

Trong lập trình C++, việc hoán đổi giá trị giữa hai biến là một thao tác phổ biến và thường được thực hiện trong các thuật toán sắp xếp, thao tác trên mảng, hoặc trong các giải pháp tối ưu hoá bộ nhớ. C++ cung cấp một công cụ tiện lợi để thực hiện tác vụ này thông qua hàm std::swap(). Bài viết này sẽ trình bày chi tiết về cách sử dụng std::swap() cũng như các tình huống thường gặp khi cần hoán đổi giá trị giữa hai biến.

Hàm std::swap()

Hàm std::swap() được định nghĩa trong thư viện <utility>, và có cú pháp đơn giản như sau:

#include <utility>

void swap(T& a, T& b);

Hàm này nhận vào hai biến tham chiếu ab và hoán đổi giá trị của chúng. Điểm hấp dẫn của std::swap() là nó hoạt động với bất kỳ kiểu dữ liệu nào, kể cả các kiểu dữ liệu tự định nghĩa.

Sử dụng std::swap()

Dưới đây là ví dụ minh họa về việc sử dụng std::swap() để hoán đổi giá trị của hai biến số nguyên:

#include <iostream>
#include <utility> // Thư viện chứa std::swap

int main() {
    int x = 10;
    int y = 20;

    std::cout << "Trước khi hoán đổi: x = " << x << ", y = " << y << std::endl;

    std::swap(x, y);

    std::cout << "Sau khi hoán đổi: x = " << x << ", y = " << y << std::endl;

    return 0;
}

Khi thực thi đoạn mã trên, kết quả sẽ là:

Trước khi hoán đổi: x = 10, y = 20
Sau khi hoán đổi: x = 20, y = 10

Hoán đổi các kiểu dữ liệu phức tạp

std::swap() không chỉ giới hạn ở các kiểu dữ liệu đơn giản như int, float, hay char. Bạn cũng có thể sử dụng hàm này với các kiểu dữ liệu phức tạp như struct, class, hay thậm chí các container của STL như std::vector, std::string.

Dưới đây là ví dụ với kiểu dữ liệu struct:

#include <iostream>
#include <utility>

struct Point {
    int x, y;
};

int main() {
    Point p1 = {10, 20};
    Point p2 = {30, 40};

    std::cout << "Trước khi hoán đổi: p1 = (" << p1.x << ", " << p1.y << "), p2 = (" << p2.x << ", " << p2.y << ")" << std::endl;

    std::swap(p1, p2);

    std::cout << "Sau khi hoán đổi: p1 = (" << p1.x << ", " << p1.y << "), p2 = (" << p2.x << ", " << p2.y << ")" << std::endl;

    return 0;
}

Tối ưu hóa hiệu suất với std::move

Trong một số tình huống, việc sao chép toàn bộ đối tượng có thể gây tốn kém, đặc biệt với các container lớn. Trong những trường hợp này, bạn có thể kết hợp std::swap() với std::move() để hoán đổi dữ liệu một cách hiệu quả hơn.

Dưới đây là cách sử dụng std::move:

#include <iostream>
#include <utility>
#include <vector>

int main() {
    std::vector<int> vec1 = {1, 2, 3, 4, 5};
    std::vector<int> vec2 = {6, 7, 8, 9, 10};
    
    std::swap(vec1, vec2);  

    std::cout << "vec1: ";
    for (int n : vec1) std::cout << n << " ";
    std::cout << std::endl;

    std::cout << "vec2: ";
    for (int n : vec2) std::cout << n << " ";
    std::cout << std::endl;

    return 0;
}

Kết luận

Hàm std::swap() là một công cụ mạnh mẽ và tiện lợi giúp hoán đổi giá trị giữa hai biến trong C++. Nó không chỉ giúp mã nguồn trở nên ngắn gọn, dễ đọc mà còn tối ưu hoá hiệu suất khi kết hợp với std::move. Việc nắm vững cách sử dụng std::swap() sẽ giúp bạn xử lý các tình huống lập trình một cách hiệu quả và chuyên nghiệp hơn.

Comments