Chuyển tới nội dung chính

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

  1. Phạm vi [first, last) là "nửa mở", không bao gồm phần tử last.
  2. replace_if() thay thế tất cả các phần tử thỏa mãn điều kiện pred.
  3. 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.
  4. replace_if() yêu cầu Forward Iterator, cho phép di chuyển một chiều về phía trước.
  5. 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.
  6. 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

replaceThay 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_ifDi 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_ifTì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ừ