Namespaces
Variants

std::partition_copy

cppreference.net에서
 
 
알고리즘 라이브러리
제약된 알고리즘 및 범위에 대한 알고리즘 (C++20)
제약된 알고리즘, 예: ranges::copy, ranges::sort, ...
정렬 및 관련 연산
분할 연산
(C++11)    

정렬 연산
이진 탐색 연산
(분할된 범위에 대해)
집합 연산 (정렬된 범위에 대해)
병합 연산 (정렬된 범위에 대해)
힙 연산
최소/최대 연산
(C++11)
(C++17)
사전식 비교 연산
순열 연산


 
헤더에 정의됨 <algorithm>
template< class InputIt, class OutputIt1,
          class OutputIt2, class UnaryPred >
std::pair<OutputIt1, OutputIt2>
    partition_copy( InputIt first, InputIt last,
                    OutputIt1 d_first_true, OutputIt2 d_first_false,
                    UnaryPred p );
(1) (C++11부터)
(C++20부터 constexpr)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2,
          class ForwardIt3, class UnaryPred >
std::pair<ForwardIt2, ForwardIt3>
    partition_copy( ExecutionPolicy&& policy,
                    ForwardIt1 first, ForwardIt1 last,
                    ForwardIt2 d_first_true, ForwardIt3 d_first_false,
                    UnaryPred p );
(2) (C++17부터)
1) 범위 [first, last)의 요소들을 조건자 p이 반환하는 값에 따라 두 개의 다른 범위로 복사합니다.
  • 조건자 p을 충족하는 요소들은 d_first_true에서 시작하는 범위로 복사됩니다.
  • 나머지 요소들은 d_first_false에서 시작하는 범위로 복사됩니다.
2) 동일한 (1)이지만, policy에 따라 실행됩니다.
이 오버로드는 다음 표현식의 값이 true인 경우에만 오버로드 해결에 참여합니다:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(C++20까지)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(C++20부터)

만약 *first이(가) 쓰기 가능하지 d_first_true 또는 d_first_false에 대한 경우, 프로그램은 잘못된 형식입니다.

입력 범위와 두 출력 범위 중 어떤 두 범위라도 겹치는 경우, 동작은 정의되지 않습니다.

매개변수

first, last - 복사할 원소들의 소스 범위 를 정의하는 반복자 쌍
d_first_true - p 조건을 만족하는 원소들을 위한 출력 범위의 시작
d_first_false - p 조건을 만족하지 않는 원소들을 위한 출력 범위의 시작
policy - 사용할 실행 정책
p - 원소가 d_first_true에 위치해야 할 경우 ​ true 를 반환하는 단항 predicate

표현식 p ( v ) 는 InputIt 의 값 타입인 VT 의 (const 가능성 있는) 모든 타입 인자 v 에 대해 값 범주 와 무관하게 bool 로 변환 가능해야 하며, v 를 수정해서는 안 됩니다. 따라서 VT & 매개변수 타입은 허용되지 않으며 , VT 에 대해 이동이 복사와 동등하지 않는 한 VT 타입도 허용되지 않습니다 (C++11부터) . ​

타입 요구사항
-
InputIt 는 LegacyInputIterator 요구사항을 충족해야 합니다.
-
OutputIt1, OutputIt2 는 LegacyOutputIterator 요구사항을 충족해야 합니다.
-
ForwardIt1, ForwardIt2, ForwardIt3 는 LegacyForwardIterator 요구사항을 충족해야 합니다.
-
UnaryPred 는 Predicate 요구사항을 충족해야 합니다.

반환값

std::pair 의 끝 부분에 대한 반복자와 d_first_true 범위의 끝 부분에 대한 반복자로부터 생성된 d_first_false 범위의 끝 부분에 대한 반복자로 구성된 쌍.

복잡도

정확히 std:: distance ( first, last ) 번의 p 적용.

오버로드 (2) 의 경우, ForwardIt 의 값 타입이 CopyConstructible 가 아닐 때 성능 비용이 발생할 수 있습니다.

예외

ExecutionPolicy 라는 템플릿 매개변수를 사용하는 오버로드는 다음과 같이 오류를 보고합니다:

  • 알고리즘의 일부로 호출된 함수 실행 중 예외가 발생하고 ExecutionPolicy 가 표준 정책 중 하나인 경우, std::terminate 가 호출됩니다. 다른 ExecutionPolicy 의 경우 동작은 구현에 따라 정의됩니다.
  • 알고리즘이 메모리 할당에 실패하는 경우, std::bad_alloc 이 throw됩니다.

가능한 구현

partition_copy (1)
template<class InputIt, class OutputIt1,
         class OutputIt2, class UnaryPred>
constexpr //< since C++20
std::pair<OutputIt1, OutputIt2>
    partition_copy(InputIt first, InputIt last,
                   OutputIt1 d_first_true, OutputIt2 d_first_false,
                   UnaryPred p)
{
    for (; first != last; ++first)
    {
        if (p(*first))
        {
            *d_first_true = *first;
            ++d_first_true;
        }
        else
        {
            *d_first_false = *first;
            ++d_first_false;
        }
    }
    return std::pair<OutputIt1, OutputIt2>(d_first_true, d_first_false);
}

예제

#include <algorithm>
#include <iostream>
#include <utility>
void print(auto rem, const auto& v)
{
    for (std::cout << rem; const auto& x : v)
        std::cout << x << ' ';
    std::cout << '\n';
}
int main()
{
    int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int true_arr[5] = {0};
    int false_arr[5] = {0};
    std::partition_copy(std::begin(arr), std::end(arr),
                        std::begin(true_arr), std::begin(false_arr),
                        [](int i) { return 4 < i; });
    print("true_arr:  ", true_arr);
    print("false_arr: ", false_arr);
}

출력:

true_arr:  5 6 7 8 9
false_arr: 0 1 2 3 4

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
P0896R4 C++11
C++17
1. InputIt (C++11)/ ForwardIt1 (C++17)의 값 타입이
CopyAssignable 요구사항을 충족해야 했음
2. 두 출력 범위가 겹칠 수 있었음
1. 요구사항 아님
2. 이 경우 동작은
정의되지 않음

같이 보기

요소 범위를 두 그룹으로 나눕니다
(함수 템플릿 & 알고리즘 함수 객체)
요소를 각 그룹 내 상대적 순서를 유지하면서 두 그룹으로 나눕니다
(함수 템플릿 & 알고리즘 함수 객체)
요소 범위를 새 위치에 복사합니다
(함수 템플릿 & 알고리즘 함수 객체)
특정 기준을 만족하는 요소를 생략하고 요소 범위를 복사합니다
(함수 템플릿 & 알고리즘 함수 객체)
요소를 두 그룹으로 나누는 범위를 복사합니다
(알고리즘 함수 객체)