std::partition_copy
| 헤더에 정의됨 <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부터) |
[first, last)의 요소들을 조건자 p이 반환하는 값에 따라 두 개의 다른 범위로 복사합니다.
- 조건자
p을 충족하는 요소들은d_first_true에서 시작하는 범위로 복사됩니다. - 나머지 요소들은
d_first_false에서 시작하는 범위로 복사됩니다.
policy에 따라 실행됩니다.true인 경우에만 오버로드 해결에 참여합니다:
|
|
(C++20까지) |
|
|
(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
는
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. 이 경우 동작은 정의되지 않음 |
같이 보기
| 요소 범위를 두 그룹으로 나눕니다 (함수 템플릿 & 알고리즘 함수 객체) | |
(C++20) |
|
| 요소를 각 그룹 내 상대적 순서를 유지하면서 두 그룹으로 나눕니다 (함수 템플릿 & 알고리즘 함수 객체) | |
(C++20) |
|
(C++11) |
요소 범위를 새 위치에 복사합니다 (함수 템플릿 & 알고리즘 함수 객체) |
(C++20)(C++20) |
|
| 특정 기준을 만족하는 요소를 생략하고 요소 범위를 복사합니다 (함수 템플릿 & 알고리즘 함수 객체) | |
(C++20)(C++20) |
|
(C++20) |
요소를 두 그룹으로 나누는 범위를 복사합니다 (알고리즘 함수 객체) |