std::copy_if()

김민수·2025년 1월 9일

C++

목록 보기
49/68

std::copy_if()<algorithm> 헤더에 포함된 함수로, 주어진 조건을 만족하는 원소만 선택하여 다른 범위로 복사하는 데 사용된다. 일반적인 복사 작업을 수행하는 std::copy()와 달리, 특정 조건을 만족하는 경우에만 원소를 복사한다는 특징이 있다.


1. 정의

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가 참인 원소만 복사한 후, 복사된 마지막 위치의 반복자를 반환한다.



2. 동작 과정

  1. 입력 범위의 원소를 순차적으로 탐색하면서 조건자 pred를 적용한다.
  2. 조건자 pred가 참(true)인 원소만 result에 복사한다.
  3. 모든 원소를 검사한 후, 마지막으로 복사된 위치의 반복자를 반환한다.

3. 사용 예시

짝수만 복사하기

#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


4. 주의사항

  1. 출력 범위 지정 주의
    • std::copy_if()는 복사 대상 범위에 충분한 공간이 있어야 하므로, 보통 std::back_inserter와 함께 사용하여 자동으로 원소가 추가되도록 하는 것이 안전하다.
  2. 조건자 함수
    • 조건자 pred는 반드시 단항 조건자이어야 하며, 반환값이 bool 타입이어야 한다.
profile
안녕하세요

0개의 댓글