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

std::replace_copy

#include <algorithm>

template <class InputIterator, class OutputIterator, class T>
OutputIterator replace_copy (InputIterator first, InputIterator last,
OutputIterator result,
const T& old_value, const T& new_value);

Sao 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, đồng thời 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 quá trình sao chép.

Tham số

first

  • Input Iterator trỏ đến phần tử đầu tiên trong phạm vi nguồn cần sao chép.

last

  • Input Iterator trỏ đến phần tử ngay sau phần tử cuối cùng trong phạm vi nguồn. Phạm vi nguồn là [first, last).

result

  • Output Iterator trỏ đến phần tử đầu tiên trong phạm vi đích nơi các phần tử sẽ được sao chép đến.

old_value

  • Giá trị cũ cần được thay thế trong quá trình sao chép.

new_value

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

Giá trị trả về

  • Output Iterator trỏ đến phần tử ngay sau phần tử cuối cùng được sao chép trong phạm vi đích.

Đặc điểm

  1. Phạm vi nguồn [first, last) là "nửa mở", không bao gồm phần tử last.
  2. Phạm vi đích phải có đủ không gian để chứa các phần tử được sao chép. Sử dụng std::back_inserter là một cách an toàn khi sao chép vào container có thể thay đổi kích thước như std::vector.
  3. replace_copy() không thay đổi phạm vi nguồn.
  4. replace_copy() sử dụng toán tử == để so sánh các phần tử với old_value.
  5. replace_copy() trả về iterator trỏ đến sau phần tử cuối cùng được sao chép trong phạm vi đích.
  6. replace_copy() thường được sử dụng để:
    • Tạo một bản sao của một container, đồng thời thay thế một số giá trị nhất định.
    • Sao chép và chuẩn hóa dữ liệu từ một nguồn sang một đích khác.
    • Kết hợp việc sao chép và thay thế trong một bước duy nhất, thay vì phải thực hiện copy() sau đó replace().
Phân biệt với replace() và copy()
  • replace() thay thế trực tiếp các giá trị trong phạm vi gốc.
  • copy() chỉ sao chép các phần tử mà không thay thế.
  • replace_copy() kết hợp cả hai: sao chép và thay thế vào một phạm vi mới.

Ví dụ

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

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

// Sao chép source sang destination, thay thế 0 bằng 9
std::replace_copy(source.begin(), source.end(), std::back_inserter(destination), 0, 9);

std::cout << "destination after replace_copy: ";
for (int x : destination) {
std::cout << x << " ";
}
std::cout << std::endl;

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

// Sao chép str sang resultStr, thay thế 'a' bằng 'o'
std::replace_copy(str.begin(), str.end(), std::back_inserter(resultStr), 'a', 'o');

std::cout << "resultStr after replace_copy: " << resultStr << std::endl;

return 0;
}

Các hàm liên quan

remove_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
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
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)
replace_copy_ifSao 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