std::copy_if
#include <algorithm>
template <class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator copy_if (InputIterator first, InputIterator last,
OutputIterator result, UnaryPredicate pred);
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 chỉ khi các phần tử đó thỏa mãn một điều kiện cụ thể được xác định bởi một hàm vị từ (predicate).
Tham số
first
- Input Iterator trỏ đến phần tử đầu tiên trong phạm vi nguồn cần kiểm tra và 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ử thỏa mãn điều kiện sẽ được sao chép đến.
pred
- Một hàm vị từ (unary predicate) nhận một đối số là phần tử trong phạm vi nguồn và trả về true nếu phần tử thỏa mãn điều kiện để được sao chép, false nếu không.
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. Nếu không, hành vi sẽ không xác định. Sử dụng std::back_inserter là một cách an toàn để tránh vấn đề này khi sao chép vào container có thể thay đổi kích thước như std::vector.
copy_if()
ghi đè các phần tử hiện có trong phạm vi đích.- Thứ tự tương đối của các phần tử được sao chép trong phạm vi đích được giữ nguyên như trong phạm vi nguồn.
- 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. copy_if()
thường được sử dụng để:- Lọc các phần tử từ một container và sao chép chúng sang một container khác dựa trên một tiêu chí nhất định.
- Tạo một bản sao của một container chỉ bao gồm các phần tử thỏa mãn một điều kiện cụ thể.
- Trích xuất các dữ liệu hợp lệ từ một tập hợp dữ liệu.
Ví dụ
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
// Hàm vị từ kiểm tra số chẵn
bool isEven(int i) {
return (i % 2) == 0;
}
int main() {
std::vector<int> source = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<int> evenNumbers; // Vector đích rỗng
// Sao chép các số chẵn từ source sang evenNumbers
std::copy_if(source.begin(), source.end(), std::back_inserter(evenNumbers), isEven);
std::cout << "Even numbers: ";
for (int x : evenNumbers) {
std::cout << x << " ";
}
std::cout << std::endl;
std::vector<int> numbersGreaterThan5;
// Sao chép các số lớn hơn 5 sử dụng biểu thức lambda
std::copy_if(source.begin(), source.end(), std::back_inserter(numbersGreaterThan5),
[](int i){ return i > 5; });
std::cout << "Numbers greater than 5: ";
for (int x : numbersGreaterThan5) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}
Các hàm liên quan
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_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 |
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 |