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
- Phạm vi nguồn
[first, last)
là "nửa mở", không bao gồm phần tửlast
. - 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.
replace_copy()
không thay đổi phạm vi nguồn.replace_copy()
sử dụng toán tử==
để so sánh các phần tử vớiold_value
.replace_copy()
trả về iterator trỏ đến sau phần tử cuối cùng được sao chép trong phạm vi đích.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_copy | 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 |
copy | 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 |
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) |
replace_copy_if | 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 |