Bài viết trình bày chức năng của hàm list::unique() trong C++ STL.
List trong STL là gì?
List là container cho phép chèn và xóa ở bất kỳ vị trí nào trong thời gian không đổi. List được triển khai dưới dạng danh sách liên kết đôi. List cho phép cấp phát bộ nhớ không liên tục. List hiệu quả hơn array, vector, deque về chèn, xóa, di chuyển phần tử. Truy cập trực tiếp phần tử trong list chậm hơn.
unique() là gì?
Hàm list::unique() xóa tất cả các phần tử trùng lặp **liền kề** trong list. Để xóa tất cả trùng lặp, list cần được sắp xếp trước.
Cú pháp
list_name.unique()
list_name.unique(binary_predicate)
Tham số
binary_predicate: hàm so sánh tùy chỉnh trả về true nếu hai phần tử được coi là bằng nhau.
Ví dụ 1
Sử dụng predicate so sánh giá trị tuyệt đối.
#include <iostream>
#include <list>
#include <cmath>
using namespace std;
bool cmp(int a, int b) {
return abs(a) == abs(b);
}
int main() {
list<int> lst = {13, 14, 13, 19, 20, 19, 15, 19, 20, 15, 15};
cout << "Elements in List: ";
for(auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
lst.unique(cmp);
cout << "\nList after unique operation: ";
for(auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
return 0;
}
Kết quả
Elements in List: 13 14 13 19 20 19 15 19 20 15 15 List after unique operation: 13 14 15 19 20
Ví dụ 2
Với kiểu float và predicate so sánh giá trị tuyệt đối.
#include <iostream>
#include <list>
#include <cmath>
using namespace std;
bool cmp(float a, float b) {
return abs(a) == abs(b);
}
int main() {
list<float> lst = {3.14, 5.56, 7.62, 9.00, 0.45, 7.62, 9.00, 7.62, 0.45, 3.00};
cout << "Elements in List: ";
for(auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
lst.unique(cmp);
cout << "\nList after unique operation: ";
for(auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
return 0;
}
Kết quả
Elements in List: 3.14 5.56 7.62 9.00 0.45 7.62 9.00 7.62 0.45 3.00 List after unique operation: 0.45 3.00 3.14 5.56 7.62 9.00