430 lines
27 KiB
Markdown
430 lines
27 KiB
Markdown
[alg.partitions]
|
||
|
||
# 26 Algorithms library [[algorithms]](./#algorithms)
|
||
|
||
## 26.8 Sorting and related operations [[alg.sorting]](alg.sorting#alg.partitions)
|
||
|
||
### 26.8.5 Partitions [alg.partitions]
|
||
|
||
[ð](#lib:is_partitioned)
|
||
|
||
`template<class InputIterator, class Predicate>
|
||
constexpr bool is_partitioned(InputIterator first, InputIterator last, Predicate pred);
|
||
template<class ExecutionPolicy, class ForwardIterator, class Predicate>
|
||
bool is_partitioned(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last, Predicate pred);
|
||
|
||
template<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_iterator [iterator.concept.input]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I> S, class Proj = identity,
|
||
[indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Pred>
|
||
constexpr bool ranges::is_partitioned(I first, S last, Pred pred, Proj proj = {});
|
||
template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Pred>
|
||
constexpr bool ranges::is_partitioned(R&& r, Pred pred, Proj proj = {});
|
||
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") I, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<I> S,
|
||
class Proj = identity, [indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Pred>
|
||
bool ranges::is_partitioned(Ep&& exec, I first, S last, Pred pred, Proj proj = {});
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Pred>
|
||
bool ranges::is_partitioned(Ep&& exec, R&& r, Pred pred, Proj proj = {});
|
||
`
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9659)
|
||
|
||
Let proj be identity{} for the overloads with no parameter named proj[.](#1.sentence-1)
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9663)
|
||
|
||
*Returns*: true if and only if the elements e of [first, last)
|
||
are partitioned with respect to the expressionbool(invoke(pred, invoke(proj, e)))[.](#2.sentence-1)
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9669)
|
||
|
||
*Complexity*: Linear[.](#3.sentence-1)
|
||
|
||
At most last - first applications of pred and proj[.](#3.sentence-2)
|
||
|
||
[ð](#lib:partition)
|
||
|
||
`template<class ForwardIterator, class Predicate>
|
||
constexpr ForwardIterator
|
||
partition(ForwardIterator first, ForwardIterator last, Predicate pred);
|
||
template<class ExecutionPolicy, class ForwardIterator, class Predicate>
|
||
ForwardIterator
|
||
partition(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last, Predicate pred);
|
||
|
||
template<[permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I> S, class Proj = identity,
|
||
[indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Pred>
|
||
constexpr subrange<I>
|
||
ranges::partition(I first, S last, Pred pred, Proj proj = {});
|
||
template<[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Pred>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<iterator_t<R>>
|
||
constexpr borrowed_subrange_t<R>
|
||
ranges::partition(R&& r, Pred pred, Proj proj = {});
|
||
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") I, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<I> S,
|
||
class Proj = identity, [indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Pred>
|
||
subrange<I> ranges::partition(Ep&& exec, I first, S last, Pred pred, Proj proj = {});
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Pred>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<iterator_t<R>>
|
||
borrowed_subrange_t<R> ranges::partition(Ep&& exec, R&& r, Pred pred, Proj proj = {});
|
||
`
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9704)
|
||
|
||
Let proj be identity{} for the overloads with no parameter named proj and let E(x) be bool(invoke(pred, invoke(proj, x)))[.](#4.sentence-1)
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9709)
|
||
|
||
*Preconditions*: For the overloads in namespace std,ForwardIterator meets
|
||
the [*Cpp17ValueSwappable*](swappable.requirements#:Cpp17ValueSwappable "16.4.4.3 Swappable requirements [swappable.requirements]") requirements ([[swappable.requirements]](swappable.requirements "16.4.4.3 Swappable requirements"))[.](#5.sentence-1)
|
||
|
||
[6](#6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9715)
|
||
|
||
*Effects*: Places all the elements e in [first, last)
|
||
that satisfy E(e) before all the elements that do not[.](#6.sentence-1)
|
||
|
||
[7](#7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9720)
|
||
|
||
*Returns*: Let i be an iterator such that E(*j) istrue for every iterator j in [first, i) andfalse for every iterator j in [i, last)[.](#7.sentence-1)
|
||
|
||
Returns:
|
||
|
||
- [(7.1)](#7.1)
|
||
|
||
i for the overloads in namespace std[.](#7.1.sentence-1)
|
||
|
||
- [(7.2)](#7.2)
|
||
|
||
{i, last} for the overloads in namespace ranges[.](#7.2.sentence-1)
|
||
|
||
[8](#8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9732)
|
||
|
||
*Complexity*: Let N=last - first:
|
||
|
||
- [(8.1)](#8.1)
|
||
|
||
For the non-parallel algorithm overloads,
|
||
exactly N applications of the predicate and projection[.](#8.1.sentence-1)
|
||
At most N/2 swaps if the type of first meets
|
||
the [*Cpp17BidirectionalIterator*](bidirectional.iterators#:Cpp17BidirectionalIterator "24.3.5.6 Bidirectional iterators [bidirectional.iterators]") requirements
|
||
for the overloads in namespace std or
|
||
models [bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12 Concept bidirectional_iterator [iterator.concept.bidir]") for the overloads in namespace ranges,
|
||
and at most N swaps otherwise[.](#8.1.sentence-2)
|
||
|
||
- [(8.2)](#8.2)
|
||
|
||
For the parallel algorithm overloads, O(NlogN) swaps and O(N) applications of the predicate[.](#8.2.sentence-1)
|
||
|
||
[ð](#lib:stable_partition)
|
||
|
||
`template<class BidirectionalIterator, class Predicate>
|
||
BidirectionalIterator
|
||
constexpr stable_partition(BidirectionalIterator first, BidirectionalIterator last,
|
||
Predicate pred);
|
||
template<class ExecutionPolicy, class BidirectionalIterator, class Predicate>
|
||
BidirectionalIterator
|
||
stable_partition(ExecutionPolicy&& exec,
|
||
BidirectionalIterator first, BidirectionalIterator last, Predicate pred);
|
||
|
||
template<[bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12 Concept bidirectional_iterator [iterator.concept.bidir]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I> S, class Proj = identity,
|
||
[indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Pred>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<I>
|
||
constexpr subrange<I> ranges::stable_partition(I first, S last, Pred pred, Proj proj = {});
|
||
template<[bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Pred>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<iterator_t<R>>
|
||
constexpr borrowed_subrange_t<R> ranges::stable_partition(R&& r, Pred pred, Proj proj = {});
|
||
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") I, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<I> S,
|
||
class Proj = identity, [indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Pred>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<I>
|
||
subrange<I>
|
||
ranges::stable_partition(Ep&& exec, I first, S last, Pred pred, Proj proj = {});
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Pred>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<iterator_t<R>>
|
||
borrowed_subrange_t<R>
|
||
ranges::stable_partition(Ep&& exec, R&& r, Pred pred, Proj proj = {});
|
||
`
|
||
|
||
[9](#9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9784)
|
||
|
||
Let proj be identity{} for the overloads with no parameter named proj and let E(x) be bool(invoke(pred, invoke(proj, x)))[.](#9.sentence-1)
|
||
|
||
[10](#10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9789)
|
||
|
||
*Preconditions*: For the overloads in namespace std,BidirectionalIterator meets
|
||
the [*Cpp17ValueSwappable*](swappable.requirements#:Cpp17ValueSwappable "16.4.4.3 Swappable requirements [swappable.requirements]") requirements ([[swappable.requirements]](swappable.requirements "16.4.4.3 Swappable requirements")) and
|
||
the type of *first meets
|
||
the [*Cpp17MoveConstructible*](utility.arg.requirements#:Cpp17MoveConstructible "16.4.4.2 Template argument requirements [utility.arg.requirements]") (Table [31](utility.arg.requirements#tab:cpp17.moveconstructible "Table 31: Cpp17MoveConstructible requirements")) and[*Cpp17MoveAssignable*](utility.arg.requirements#:Cpp17MoveAssignable "16.4.4.2 Template argument requirements [utility.arg.requirements]") (Table [33](utility.arg.requirements#tab:cpp17.moveassignable "Table 33: Cpp17MoveAssignable requirements")) requirements[.](#10.sentence-1)
|
||
|
||
[11](#11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9798)
|
||
|
||
*Effects*: Places all the elements e in [first, last)
|
||
that satisfy E(e) before all the elements that do not[.](#11.sentence-1)
|
||
|
||
The relative order of the elements in both groups is preserved[.](#11.sentence-2)
|
||
|
||
[12](#12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9804)
|
||
|
||
*Returns*: Let i be an iterator
|
||
such that for every iterator j in [first, i),E(*j) is true,
|
||
and for every iterator j in the range [i, last),E(*j) is false[.](#12.sentence-1)
|
||
|
||
Returns:
|
||
|
||
- [(12.1)](#12.1)
|
||
|
||
i for the overloads in namespace std[.](#12.1.sentence-1)
|
||
|
||
- [(12.2)](#12.2)
|
||
|
||
{i, last} for the overloads in namespace ranges[.](#12.2.sentence-1)
|
||
|
||
[13](#13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9817)
|
||
|
||
*Complexity*: Let N = last - first:
|
||
|
||
- [(13.1)](#13.1)
|
||
|
||
For the non-parallel algorithm overloads,
|
||
at most Nlog2N swaps,
|
||
but only O(N) swaps if there is enough extra memory[.](#13.1.sentence-1)
|
||
Exactly N applications of the predicate and projection[.](#13.1.sentence-2)
|
||
|
||
- [(13.2)](#13.2)
|
||
|
||
For the parallel algorithm overloads, O(NlogN) swaps and O(N) applications of the predicate[.](#13.2.sentence-1)
|
||
|
||
[ð](#lib:partition_copy)
|
||
|
||
`template<class InputIterator, class OutputIterator1, class OutputIterator2, class Predicate>
|
||
constexpr pair<OutputIterator1, OutputIterator2>
|
||
partition_copy(InputIterator first, InputIterator last,
|
||
OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred);
|
||
template<class ExecutionPolicy, class ForwardIterator, class ForwardIterator1,
|
||
class ForwardIterator2, class Predicate>
|
||
pair<ForwardIterator1, ForwardIterator2>
|
||
partition_copy(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last,
|
||
ForwardIterator1 out_true, ForwardIterator2 out_false, Predicate pred);
|
||
|
||
template<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_iterator [iterator.concept.input]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I> S, [weakly_incrementable](iterator.concept.winc#concept:weakly_incrementable "24.3.4.4 Concept weakly_incrementable [iterator.concept.winc]") O1, [weakly_incrementable](iterator.concept.winc#concept:weakly_incrementable "24.3.4.4 Concept weakly_incrementable [iterator.concept.winc]") O2,
|
||
class Proj = identity, [indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Pred>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O1> && [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O2>
|
||
constexpr ranges::partition_copy_result<I, O1, O2>
|
||
ranges::partition_copy(I first, S last, O1 out_true, O2 out_false, Pred pred,
|
||
Proj proj = {});
|
||
template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R, [weakly_incrementable](iterator.concept.winc#concept:weakly_incrementable "24.3.4.4 Concept weakly_incrementable [iterator.concept.winc]") O1, [weakly_incrementable](iterator.concept.winc#concept:weakly_incrementable "24.3.4.4 Concept weakly_incrementable [iterator.concept.winc]") O2,
|
||
class Proj = identity,
|
||
[indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Pred>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, O1> &&
|
||
[indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, O2>
|
||
constexpr ranges::partition_copy_result<borrowed_iterator_t<R>, O1, O2>
|
||
ranges::partition_copy(R&& r, O1 out_true, O2 out_false, Pred pred, Proj proj = {});
|
||
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") I, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<I> S,
|
||
[random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") O1, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O1> OutS1,
|
||
[random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") O2, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O2> OutS2,
|
||
class Proj = identity, [indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Pred>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O1> && [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O2>
|
||
ranges::partition_copy_result<I, O1, O2>
|
||
ranges::partition_copy(Ep&& exec, I first, S last, O1 out_true, OutS1 last_true,
|
||
O2 out_false, OutS2 last_false, Pred pred, Proj proj = {});
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") R,
|
||
[sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") OutR1, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") OutR2,
|
||
class Proj = identity,
|
||
[indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Pred>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, iterator_t<OutR1>> &&
|
||
[indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, iterator_t<OutR2>>
|
||
ranges::partition_copy_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR1>,
|
||
borrowed_iterator_t<OutR2>>
|
||
ranges::partition_copy(Ep&& exec, R&& r, OutR1&& out_true_r, OutR2&& out_false_r,
|
||
Pred pred, Proj proj = {});
|
||
`
|
||
|
||
[14](#14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9880)
|
||
|
||
Let proj be identity{} for the overloads with no parameter named proj and
|
||
let E(x) be bool(invoke(pred, invoke(proj, x)))[.](#14.sentence-1)
|
||
|
||
[15](#15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9885)
|
||
|
||
For the overloads with no parameterslast_true, last_false, out_true_r, or out_false_r,
|
||
let
|
||
|
||
- [(15.1)](#15.1)
|
||
|
||
M be the number of iterators i in [first, last)
|
||
for which E(*i) is true,
|
||
and K be last - first - M;
|
||
|
||
- [(15.2)](#15.2)
|
||
|
||
last_true be out_true + M, and last_false be out_false + K[.](#15.sentence-1)
|
||
|
||
[16](#16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9899)
|
||
|
||
For the overloads with parameterslast_true, last_false, out_true_r, or out_false_r,
|
||
let M be last_true - out_true and K be last_false - out_false[.](#16.sentence-1)
|
||
|
||
[17](#17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9905)
|
||
|
||
Let:
|
||
|
||
- [(17.1)](#17.1)
|
||
|
||
i1 be the iterator in [first, last)
|
||
for which E(*i1) is true and there are exactly M iterators j in [first, i1)
|
||
for which E(*j) is true,
|
||
or last if no such iterator exists;
|
||
|
||
- [(17.2)](#17.2)
|
||
|
||
i2 be the iterator in [first, last)
|
||
for which E(*i2) is false and there are exactly K iterators j in [first, i2)
|
||
for which E(*j) is false,
|
||
or last if no such iterator exists;
|
||
|
||
- [(17.3)](#17.3)
|
||
|
||
N be min(i1 - first, i2 - first)[.](#17.sentence-1)
|
||
|
||
[18](#18)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9924)
|
||
|
||
*Mandates*: For the overloads in namespace std,
|
||
the expression *first is writable ([[iterator.requirements.general]](iterator.requirements.general "24.3.1 General"))
|
||
to out_true and out_false[.](#18.sentence-1)
|
||
|
||
[19](#19)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9931)
|
||
|
||
*Preconditions*: The input range and output ranges do not overlap[.](#19.sentence-1)
|
||
|
||
[*Note [1](#note-1)*:
|
||
|
||
For the parallel algorithm overload in namespace std,
|
||
there can be a performance cost if first's value type
|
||
does not meet the *Cpp17CopyConstructible* requirements[.](#19.sentence-2)
|
||
|
||
For the parallel algorithm overloads in namespace ranges,
|
||
there can be a performance cost if first's value type
|
||
does not model [copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_constructible [concept.copyconstructible]")[.](#19.sentence-3)
|
||
|
||
â *end note*]
|
||
|
||
[20](#20)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9944)
|
||
|
||
*Effects*: For each iterator i in [first, first + N),
|
||
copies *i to the output range [out_true, last_true)
|
||
if E(*i) is true, or
|
||
to the output range [out_false, last_false) otherwise[.](#20.sentence-1)
|
||
|
||
[21](#21)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9951)
|
||
|
||
*Returns*: Let o1 be the iterator past the last copied element
|
||
in the output range [out_true, last_true),
|
||
and o2 be the iterator past the last copied element
|
||
in the output range [out_false, last_false)[.](#21.sentence-1)
|
||
|
||
Returns:
|
||
|
||
- [(21.1)](#21.1)
|
||
|
||
{o1, o2} for the overloads in namespace std[.](#21.1.sentence-1)
|
||
|
||
- [(21.2)](#21.2)
|
||
|
||
{first + N, o1, o2} for the overloads in namespace ranges[.](#21.2.sentence-1)
|
||
|
||
[22](#22)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9963)
|
||
|
||
*Complexity*: At most last - first applications of pred and proj[.](#22.sentence-1)
|
||
|
||
[ð](#lib:partition_point)
|
||
|
||
`template<class ForwardIterator, class Predicate>
|
||
constexpr ForwardIterator
|
||
partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
|
||
|
||
template<[forward_iterator](iterator.concept.forward#concept:forward_iterator "24.3.4.11 Concept forward_iterator [iterator.concept.forward]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I> S, class Proj = identity,
|
||
[indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Pred>
|
||
constexpr I ranges::partition_point(I first, S last, Pred pred, Proj proj = {});
|
||
template<[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Pred>
|
||
constexpr borrowed_iterator_t<R>
|
||
ranges::partition_point(R&& r, Pred pred, Proj proj = {});
|
||
`
|
||
|
||
[23](#23)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9984)
|
||
|
||
Let proj be identity{} for the overloads with no parameter named proj and let E(x) be bool(invoke(pred, invoke(proj, x)))[.](#23.sentence-1)
|
||
|
||
[24](#24)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9989)
|
||
|
||
*Preconditions*: The elements e of [first, last)
|
||
are partitioned with respect to E(e)[.](#24.sentence-1)
|
||
|
||
[25](#25)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9994)
|
||
|
||
*Returns*: An iterator mid such that E(*i) is true for all iterators i in [first, mid), andfalse for all iterators i in [mid, last)[.](#25.sentence-1)
|
||
|
||
[26](#26)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L10001)
|
||
|
||
*Complexity*: O(log(last - first)) applications
|
||
of pred and proj[.](#26.sentence-1)
|