std::forward_list::remove_if
#include <forward_list>
template <class UnaryPredicate>
void remove_if(UnaryPredicate p);
Xóa tất cả các phần tử thỏa mãn một điều kiện cụ thể khỏi forward_list. Điều kiện này được xác định bởi một unary predicate (một hàm hoặc functor nhận một đối số và trả về true hoặc false).
Tham số
p
- Một unary predicate xác định điều kiện xóa phần tử. Đây có thể là:
- Một con trỏ hàm (như isEven trong ví dụ).
- Một functor (một đối tượng lớp có
operator()
được nạp chồng). - Một biểu thức lambda (như
[](int n) { return n > 5; }
trong ví dụ).
p
phải nhận một đối số có kiểu làvalue_type
của forward_list (hoặc kiểu có thể chuyển đổi thànhvalue_type
) và trả về true nếu phần tử tương ứng nên bị xóa, false nếu ngược lại.
Giá trị trả về
Không có giá trị trả về
Đặc điểm
- Xóa theo điều kiện:
remove_if()
xóa tất cả các phần tử thỏa mãn điều kiện được xác định bởip
, không phải xóa theo giá trị cụ thể nhưremove()
. - Duyệt toàn bộ danh sách:
remove_if()
phải duyệt qua toàn bộ forward_list để kiểm tra từng phần tử. - Không làm thay đổi vị trí tương đối của các phần tử còn lại:
remove_if()
chỉ xóa các phần tử thỏa mãn điều kiện, thứ tự tương đối của các phần tử còn lại được giữ nguyên. - Có thể làm thay đổi iterator: Thao tác xóa phần tử có thể làm thay đổi (invalidate) các iterator đang trỏ đến forward_list.
- Phân biệt với remove():
remove()
xóa phần tử theo giá trị cụ thể, cònremove_if()
xóa phần tử theo điều kiện tổng quát hơn. - Độ phức tạp: Độ phức tạp của
remove_if()
làO(n)
, với n là số phần tử trong forward_list.
Ví dụ
#include <iostream>
#include <forward_list>
// Hàm kiểm tra số chẵn
bool isEven(int n) {
return n % 2 == 0;
}
int main() {
std::forward_list<int> mylist = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// Xóa tất cả các số chẵn (sử dụng hàm isEven)
mylist.remove_if(isEven);
std::cout << "mylist after remove_if(isEven):";
for (int x : mylist) std::cout << ' ' << x; // Output: mylist after remove_if(isEven): 1 3 5 7 9
std::cout << '\n';
// Xóa tất cả các số lớn hơn 5 (sử dụng lambda function)
mylist.remove_if([](int n) { return n > 5; });
std::cout << "mylist after remove_if(n > 5):";
for (int x : mylist) std::cout << ' ' << x; // Output: mylist after remove_if(n > 5): 1 3 5
std::cout << '\n';
return 0;
}
Sử dụng functor
#include <iostream>
#include <forward_list>
#include <string>
// Functor kiểm tra độ dài chuỗi
class StringLengthChecker {
public:
StringLengthChecker(size_t len) : length(len) {}
bool operator()(const std::string& str) const {
return str.length() > length;
}
private:
size_t length;
};
int main() {
std::forward_list<std::string> mylist = {"apple", "banana", "kiwi", "grapefruit", "pear"};
// Xóa tất cả các chuỗi có độ dài lớn hơn 5
StringLengthChecker checker(5);
mylist.remove_if(checker);
std::cout << "mylist after remove_if(StringLengthChecker(5)):";
for (const std::string& str : mylist) std::cout << ' ' << str; // Output: mylist after remove_if(StringLengthChecker(5)): apple kiwi pear
std::cout << '\n';
return 0;
}
Các hàm liên quan
remove | Xóa tất cả các phần tử có giá trị bằng với một giá trị cho trước khỏi forward_list |
erase_after | Xóa một hoặc nhiều phần tử khỏi forward_list tại vị trí sau một iterator cho trước |
unique | Xóa các phần tử trùng lặp liên tiếp khỏi forward_list |
pop_front | Xóa phần tử đầu tiên của forward_list |