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

std::replace

#include <algorithm>

template <class ForwardIterator, class T>
void replace (ForwardIterator first, ForwardIterator last,
const T& old_value, const T& new_value);

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).

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).

old_value

  • Giá trị cũ cần được thay thế.

new_value

  • Giá trị mới sẽ thay thế cho giá trị cũ.

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() thay thế tất cả các lần xuất hiện của old_value trong phạm vi.
  3. replace() sử dụng toán tử == để so sánh các phần tử với old_value. Đối với các kiểu dữ liệu tự định nghĩa, bạn cần đảm bảo đã nạp chồng toán tử == cho kiểu dữ liệu đó.
  4. replace() 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.
  5. replace() yêu cầu Forward Iterator, cho phép di chuyển một chiều về phía trước.
  6. replace() thường được sử dụng để:
    • Thay thế một giá trị cụ thể bằng một giá trị khác trong một container (ví dụ: thay thế tất cả số 0 bằng số 1 trong một vector).
    • Chuẩn hóa dữ liệu bằng cách thay thế các giá trị không mong muốn bằng các giá trị mặc định.
    • Chỉnh sửa dữ liệu trong một container dựa trên một giá trị cụ thể.
Phân biệt với replace_if()
  • replace() thay thế các phần tử có giá trị bằng với old_value.
  • replace_if() thay thế các phần tử thỏa mãn một điều kiện (được xác định bởi một hàm vị từ) thay vì so sánh giá trị đơn thuần.

Ví dụ

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

int main() {
std::vector<int> numbers = {1, 2, 0, 3, 0, 4, 0, 5};

// Thay thế tất cả số 0 bằng số 9
std::replace(numbers.begin(), numbers.end(), 0, 9);

std::cout << "numbers after replace: ";
for (int x : numbers) {
std::cout << x << " ";
}
std::cout << std::endl;

std::string str = "apple banana apple apple";

// Thay thế tất cả "apple" bằng "orange"
std::replace(str.begin(), str.end(), 'a', 'o'); // thay thế ký tự

std::cout << "str after replace: " << str << std::endl;

return 0;
}

Các hàm liên quan

replace_ifThay 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ể bằng một giá trị mới
replace_copySao chép các phần tử từ một phạm vi (range) nguồn sang một phạm vi đích khác
removeDi chuyển các phần tử không bị "xóa" 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
countĐếm số lần xuất hiện của một giá trị cụ thể trong một phạm vi được chỉ định
findTìm kiếm phần tử đầu tiên trong một phạm vi có giá trị bằng với một giá trị cho trước