std::copy_if()는 <algorithm> 헤더에 포함된 함수로, 주어진 조건을 만족하는 원소만 선택하여 다른 범위로 복사하는 데 사용된다. 일반적인 복사 작업을 수행하는 std::copy()와 달리, 특정 조건을 만족하는 경우에만 원소를 복사한다는 특징이 있다.
template<class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator copy_if(InputIterator first, InputIterator last,
OutputIterator result, UnaryPredicate pred);
first, last: 입력 범위의 시작과 끝 반복자result: 복사할 대상 범위의 시작 반복자pred: 복사할 원소를 선택하는 조건을 나타내는 단항 조건자 함수(람다식, 함수 포인터, 함수 객체 등)std::copy_if()는 입력 범위에서 조건자 pred가 참인 원소만 복사한 후, 복사된 마지막 위치의 반복자를 반환한다.
pred를 적용한다.pred가 참(true)인 원소만 result에 복사한다.#include <iostream>
#include <vector>
#include <algorithm> // std::copy_if
int main() {
std::vector<int> input = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<int> output;
// 짝수인 경우에만 복사
std::copy_if(input.begin(), input.end(), std::back_inserter(output),
[](int x) { return x % 2 == 0; });
// 출력
std::cout << "Even numbers: ";
for (int n : output) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
Even numbers: 2 4 6 8 10
[1, 2, ..., 10]에서 조건자 [](int x) { return x % 2 == 0; }가 참인 원소(짝수)만 output 벡터에 복사된다.std::back_inserter(output)는 반복자가 도달할 때마다 output 벡터에 새로운 원소를 자동으로 추가한다.#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> input = {-5, 3, -1, 7, -9, 4, 0};
std::vector<int> output;
// 음수인 경우에만 복사
std::copy_if(input.begin(), input.end(), std::back_inserter(output),
[](int x) { return x < 0; });
// 출력
std::cout << "Negative numbers: ";
for (int n : output) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
Negative numbers: -5 -1 -9
std::copy_if()는 복사 대상 범위에 충분한 공간이 있어야 하므로, 보통 std::back_inserter와 함께 사용하여 자동으로 원소가 추가되도록 하는 것이 안전하다.pred는 반드시 단항 조건자이어야 하며, 반환값이 bool 타입이어야 한다.