std::replace_if
#include <algorithm>
template <class ForwardIterator, class UnaryPredicate, class T>
void replace_if (ForwardIterator first, ForwardIterator last,
UnaryPredicate pred, const T& new_value);
Thay thế tất cả các phần tử trong một phạm vi (range) thỏa mãn một điều kiện cụ thể (được xác định bởi một hàm vị từ) bằng một giá trị mới.
Tham số
first
- Forward Iterator trỏ đến phần tử đầu tiên trong phạm vi cần thay thế.
last
- Forward Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong phạm vi cần thay thế. Phạm vi là
[first, last)
.
pred
- Một hàm vị từ (unary predicate) nhận một đối số là phần tử trong phạm vi và trả về true nếu phần tử thỏa mãn điều kiện để bị thay thế, false nếu không.
new_value
- Giá trị mới sẽ thay thế cho các phần tử thỏa mãn điều kiện.
Giá trị trả về
Không có giá trị trả về
Đặc điểm
- Phạm vi
[first, last)
là "nửa mở", không bao gồm phần tửlast
. replace_if()
thay thế tất cả các phần tử thỏa mãn điều kiệnpred
.replace_if()
thay đổi trực tiếp các phần tử trong phạm vi, không tạo ra một phạm vi mới.replace_if()
yêu cầu Forward Iterator, cho phép di chuyển một chiều về phía trước.- Trong C++11 trở lên, sử dụng biểu thức lambda cho hàm vị từ
pred
thường ngắn gọn và dễ đọc hơn. replace_if()
thường được sử dụng để:- Thay thế các phần tử trong một container dựa trên một tiêu chí nhất định (ví dụ: thay thế tất cả số âm bằng số 0, thay thế tất cả chuỗi rỗng bằng chuỗi mặc định).
- Chuẩn hóa dữ liệu bằng cách thay thế các giá trị không hợp lệ bằng các giá trị hợp lệ.
- Chỉnh sửa dữ liệu trong một container dựa trên một điều kiện phức tạp.
Phân biệt với replace()
replace()
thay thế các phần tử có giá trị bằng với một giá trị cho trước.replace_if()
thay thế các phần tử thỏa mãn một điều kiện (hàm vị từ) thay vì so sánh giá trị đơn thuần.
Ví dụ
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
// Hàm vị từ kiểm tra số âm
bool isNegative(int n) {
return n < 0;
}
int main() {
std::vector<int> numbers = {1, -2, 3, -4, 5, -6};
// Thay thế tất cả số âm bằng số 0
std::replace_if(numbers.begin(), numbers.end(), isNegative, 0);
std::cout << "numbers after replace_if: ";
for (int x : numbers) {
std::cout << x << " ";
}
std::cout << std::endl;
std::vector<std::string> words = {"apple", "", "banana", "", "orange"};
// Thay thế tất cả chuỗi rỗng bằng "empty" sử dụng biểu thức lambda
std::replace_if(words.begin(), words.end(), [](const std::string& s){ return s.empty(); }, "empty");
std::cout << "words after replace_if: ";
for (const std::string& w : words) {
std::cout << w << " ";
}
std::cout << std::endl;
return 0;
}
Các hàm liên quan
replace | Thay thế tất cả các lần xuất hiện của một giá trị cũ bằng một giá trị mới trong một phạm vi (range) |
remove_if | Di chuyển các phần tử không thỏa mãn điều kiện lên đầu phạm vi, và trả về một iterator trỏ đến phần tử ngay sau phần tử cuối cùng của dãy mới |
transform | Áp dụng một hàm (hoặc đối tượng hàm) cho mỗi phần tử trong một phạm vi (range) đầu vào và lưu trữ kết quả vào một phạm vi đầu ra |
for_each | Áp dụng một hàm (hoặc đối tượng hàm) cho mỗi phần tử trong một phạm vi được chỉ định |
find_if | Tìm kiếm phần tử đầu tiên trong một phạm vi thỏa mãn một điều kiện cụ thể được xác định bởi một hàm vị từ |