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
-
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ụngstd::sort
để thực hiện việc này. -
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. -
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()
và 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