std::remove_copy
#include <algorithm>
template <class InputIterator, class OutputIterator, class T>
OutputIterator remove_copy (InputIterator first, InputIterator last,
OutputIterator result, const T& val);
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, bỏ qua (không sao chép) các phần tử có giá trị bằng với một giá trị cho trước.
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.
val
- Giá trị của các phần tử không được sao chép sang phạm vi đích.
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.
remove_copy()
không thay đổi phạm vi nguồn.remove_copy()
sử dụng toán tử==
để so sánh các phần tử vớival
.remove_copy()
trả về iterator trỏ đến sau phần tử cuối cùng được sao chép trong phạm vi đích.remove_copy()
thường được sử dụng để:- Tạo một bản sao của một container, loại bỏ các phần tử có giá trị xác định trước.
- Sao chép dữ liệu từ nguồn sang đích, lọc bỏ các giá trị không mong muốn.
- Kết hợp việc sao chép và lọc dữ liệu trong một bước duy nhất.
Phân biệt với remove(), remove_if(), và copy_if()
remove()
di chuyển các phần tử "cần giữ lại" lên đầu phạm vi, nhưng không thay đổi kích thước. Cầnerase()
để xóa phần thừa.remove_if()
tương tựremove()
nhưng dựa trên điều kiện (hàm vị từ).copy_if()
chỉ sao chép các phần tử thỏa mãn điều kiện.remove_copy()
sao chép các phần tử không bằng vớival
sang phạm vi đích.remove_copy_if()
sao chép các phần tử không thỏa mãn điều kiện (hàm vị từ) sang phạm vi đích.
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, bỏ qua các số 0
std::remove_copy(source.begin(), source.end(), std::back_inserter(destination), 0);
std::cout << "destination after remove_copy: ";
for (int x : destination) {
std::cout << x << " ";
}
std::cout << std::endl;
std::string str = "This string has extra spaces.";
std::string resultStr;
// Sao chép str sang resultStr, bỏ qua các khoảng trắng
std::remove_copy(str.begin(), str.end(), std::back_inserter(resultStr), ' ');
std::cout << "resultStr after remove_copy: " << resultStr << std::endl;
return 0;
}
Các hàm liên quan
remove | Di 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 |
remove_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 |
replace_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 |
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 |
find | Tì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 |