×

Loại bỏ phần tử trùng lặp với hàm std::unique() trong C++

Trong lập trình C++, việc loại bỏ các phần tử trùng lặp trong một container như vector là một nhiệm vụ phổ biến. Thư viện chuẩn C++ cung cấp nhiều công cụ mạnh mẽ giúp thực hiện điều này, và một trong những công cụ hữu ích chính là hàm std::unique(). Hàm này được tìm thấy trong thư viện <algorithm> và có thể làm việc với nhiều loại container khác nhau.

Cách Hoạt Động của std::unique()

Hàm std::unique() không trực tiếp loại bỏ các phần tử trùng lặp từ container, thay vào đó, hàm này sắp xếp lại thứ tự các phần tử và đặt các phần tử trùng lặp vào cuối container. Phần trả về của hàm là một iterator trỏ tới phần tử đầu tiên trong dãy bị loại bỏ, cho phép dễ dàng xóa các phần tử không mong muốn.

Cú Pháp Cơ Bản

#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 2, 3, 4, 4, 5};

    // Sắp xếp vector trước khi gọi std::unique()
    std::sort(vec.begin(), vec.end());
    
    // Lấy iterator của phần tử cuối cùng của các phần tử duy nhất
    auto it = std::unique(vec.begin(), vec.end());

    // Xóa các phần tử không còn có giá trị
    vec.erase(it, vec.end());

    for (const auto& elem : vec) {
        std::cout << elem << ' ';
    }
    return 0;
}

Giải Thích

  1. Sắp xếp Container: Trước tiên, cần phải sắp xếp container bởi vì std::unique() chỉ loại bỏ các phần tử trùng lặp liên tiếp. Sử dụng std::sort để thực hiện việc này.

  2. Gọi std::unique(): Hàm std::unique() sẽ di chuyển các phần tử trùng lặp sang cuối container. Kết quả trả về là một iterator tới vị trí ngay sau phần tử cuối cùng của dãy các phần tử duy nhất.

  3. Xóa Phần Tử Thừa: Sử dụng phương thức erase() của container để xóa các phần tử từ iterator vừa nhận được đến cuối container.

Ví Dụ Ứng Dụng

Chuỗi Ký Tự

Nếu bạn có một chuỗi ký tự và muốn loại bỏ các ký tự trùng lặp, quá trình thực hiện cũng tương tự.

#include <algorithm>
#include <string>
#include <iostream>

int main() {
    std::string str = "aabbccdd";

    // Sort lại chuỗi
    std::sort(str.begin(), str.end());

    // Sử dụng std::unique() để loại bỏ ký tự trùng lặp
    auto it = std::unique(str.begin(), str.end());

    // Xóa phần tử trùng lặp
    str.erase(it, str.end());

    std::cout << str << std::endl;
    return 0;
}

Lưu Ý

  • Sắp Xếp Đầu Tiên: Việc sắp xếp là cần thiết trước khi gọi std::unique() để đảm bảo tất cả các phần tử trùng lặp nằm cạnh nhau.
  • Hiệu Năng: Quá trình sắp xếp có độ phức tạp thời gian là O(n log n), trong khi std::unique() có độ phức tạp là O(n).

Kết Luận

Việc loại bỏ các phần tử trùng lặp trong C++ có thể được thực hiện một cách hiệu quả bằng cách kết hợp hàm std::sort()std::unique(). Điều này không chỉ giúp giữ cho code của bạn gọn gàng mà còn tăng hiệu năng xử lý dữ liệu. Những thao tác này rất hữu ích trong các bài toán xử lý dữ liệu, thuật toán hay bất kỳ ứng dụng nào cần quản lý danh sách các phần tử duy nhất.

Comments