560 lines
36 KiB
Markdown
560 lines
36 KiB
Markdown
[alg.sort]
|
||
|
||
# 26 Algorithms library [[algorithms]](./#algorithms)
|
||
|
||
## 26.8 Sorting and related operations [[alg.sorting]](alg.sorting#alg.sort)
|
||
|
||
### 26.8.2 Sorting [alg.sort]
|
||
|
||
#### [26.8.2.1](#sort) sort [[sort]](sort)
|
||
|
||
[ð](#lib:sort)
|
||
|
||
`template<class RandomAccessIterator>
|
||
constexpr void sort(RandomAccessIterator first, RandomAccessIterator last);
|
||
template<class ExecutionPolicy, class RandomAccessIterator>
|
||
void sort(ExecutionPolicy&& exec,
|
||
RandomAccessIterator first, RandomAccessIterator last);
|
||
|
||
template<class RandomAccessIterator, class Compare>
|
||
constexpr void sort(RandomAccessIterator first, RandomAccessIterator last,
|
||
Compare comp);
|
||
template<class ExecutionPolicy, class RandomAccessIterator, class Compare>
|
||
void sort(ExecutionPolicy&& exec,
|
||
RandomAccessIterator first, RandomAccessIterator last,
|
||
Compare comp);
|
||
|
||
template<[random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I> S, class Comp = ranges::less,
|
||
class Proj = identity>
|
||
requires [sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")<I, Comp, Proj>
|
||
constexpr I
|
||
ranges::sort(I first, S last, Comp comp = {}, Proj proj = {});
|
||
template<[random_access_range](range.refinements#concept:random_access_range "25.4.6 Other range refinements [range.refinements]") R, class Comp = ranges::less, class Proj = identity>
|
||
requires [sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")<iterator_t<R>, Comp, Proj>
|
||
constexpr borrowed_iterator_t<R>
|
||
ranges::sort(R&& r, Comp comp = {}, 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 Comp = ranges::less, class Proj = identity>
|
||
requires [sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")<I, Comp, Proj>
|
||
I ranges::sort(Ep&& exec, I first, S last, Comp comp = {}, 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 Comp = ranges::less,
|
||
class Proj = identity>
|
||
requires [sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")<iterator_t<R>, Comp, Proj>
|
||
borrowed_iterator_t<R> ranges::sort(Ep&& exec, R&& r, Comp comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[1](#sort-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8795)
|
||
|
||
Let comp be less{} and proj be identity{} for the overloads with no parameters by those names[.](#sort-1.sentence-1)
|
||
|
||
[2](#sort-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8800)
|
||
|
||
*Preconditions*: For the overloads in namespace std,RandomAccessIterator 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[.](#sort-2.sentence-1)
|
||
|
||
[3](#sort-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8809)
|
||
|
||
*Effects*: Sorts the elements in the range [first, last)
|
||
with respect to comp and proj[.](#sort-3.sentence-1)
|
||
|
||
[4](#sort-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8814)
|
||
|
||
*Returns*: last for the overloads in namespace ranges[.](#sort-4.sentence-1)
|
||
|
||
[5](#sort-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8818)
|
||
|
||
*Complexity*: Let N be last - first[.](#sort-5.sentence-1)
|
||
|
||
O(NlogN) comparisons and projections[.](#sort-5.sentence-2)
|
||
|
||
#### [26.8.2.2](#stable.sort) stable_sort [[stable.sort]](stable.sort)
|
||
|
||
[ð](#lib:stable_sort)
|
||
|
||
`template<class RandomAccessIterator>
|
||
constexpr void stable_sort(RandomAccessIterator first, RandomAccessIterator last);
|
||
template<class ExecutionPolicy, class RandomAccessIterator>
|
||
void stable_sort(ExecutionPolicy&& exec,
|
||
RandomAccessIterator first, RandomAccessIterator last);
|
||
|
||
template<class RandomAccessIterator, class Compare>
|
||
constexpr void stable_sort(RandomAccessIterator first, RandomAccessIterator last,
|
||
Compare comp);
|
||
template<class ExecutionPolicy, class RandomAccessIterator, class Compare>
|
||
void stable_sort(ExecutionPolicy&& exec,
|
||
RandomAccessIterator first, RandomAccessIterator last,
|
||
Compare comp);
|
||
|
||
template<[random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I> S, class Comp = ranges::less,
|
||
class Proj = identity>
|
||
requires [sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")<I, Comp, Proj>
|
||
constexpr I ranges::stable_sort(I first, S last, Comp comp = {}, Proj proj = {});
|
||
template<[random_access_range](range.refinements#concept:random_access_range "25.4.6 Other range refinements [range.refinements]") R, class Comp = ranges::less, class Proj = identity>
|
||
requires [sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")<iterator_t<R>, Comp, Proj>
|
||
constexpr borrowed_iterator_t<R>
|
||
ranges::stable_sort(R&& r, Comp comp = {}, 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 Comp = ranges::less, class Proj = identity>
|
||
requires [sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")<I, Comp, Proj>
|
||
I ranges::stable_sort(Ep&& exec, I first, S last, Comp comp = {}, 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 Comp = ranges::less,
|
||
class Proj = identity>
|
||
requires [sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")<iterator_t<R>, Comp, Proj>
|
||
borrowed_iterator_t<R>
|
||
ranges::stable_sort(Ep&& exec, R&& r, Comp comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[1](#stable.sort-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8863)
|
||
|
||
Let comp be less{} and proj be identity{} for the overloads with no parameters by those names[.](#stable.sort-1.sentence-1)
|
||
|
||
[2](#stable.sort-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8868)
|
||
|
||
*Preconditions*: For the overloads in namespace std,RandomAccessIterator 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[.](#stable.sort-2.sentence-1)
|
||
|
||
[3](#stable.sort-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8877)
|
||
|
||
*Effects*: Sorts the elements in the range [first, last)
|
||
with respect to comp and proj[.](#stable.sort-3.sentence-1)
|
||
|
||
[4](#stable.sort-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8882)
|
||
|
||
*Returns*: last for the overloads in namespace ranges[.](#stable.sort-4.sentence-1)
|
||
|
||
[5](#stable.sort-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8886)
|
||
|
||
*Complexity*: Let N be last - first[.](#stable.sort-5.sentence-1)
|
||
|
||
If enough extra memory is available, Nlog(N) comparisons[.](#stable.sort-5.sentence-2)
|
||
|
||
Otherwise, at most Nlog2(N) comparisons[.](#stable.sort-5.sentence-3)
|
||
|
||
In either case, twice as many projections as the number of comparisons[.](#stable.sort-5.sentence-4)
|
||
|
||
[6](#stable.sort-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8893)
|
||
|
||
*Remarks*: Stable ([[algorithm.stable]](algorithm.stable "16.4.6.8 Requirements for stable algorithms"))[.](#stable.sort-6.sentence-1)
|
||
|
||
#### [26.8.2.3](#partial.sort) partial_sort [[partial.sort]](partial.sort)
|
||
|
||
[ð](#lib:partial_sort)
|
||
|
||
`template<class RandomAccessIterator>
|
||
constexpr void partial_sort(RandomAccessIterator first,
|
||
RandomAccessIterator middle,
|
||
RandomAccessIterator last);
|
||
template<class ExecutionPolicy, class RandomAccessIterator>
|
||
void partial_sort(ExecutionPolicy&& exec,
|
||
RandomAccessIterator first,
|
||
RandomAccessIterator middle,
|
||
RandomAccessIterator last);
|
||
|
||
template<class RandomAccessIterator, class Compare>
|
||
constexpr void partial_sort(RandomAccessIterator first,
|
||
RandomAccessIterator middle,
|
||
RandomAccessIterator last,
|
||
Compare comp);
|
||
template<class ExecutionPolicy, class RandomAccessIterator, class Compare>
|
||
void partial_sort(ExecutionPolicy&& exec,
|
||
RandomAccessIterator first,
|
||
RandomAccessIterator middle,
|
||
RandomAccessIterator last,
|
||
Compare comp);
|
||
|
||
template<[random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I> S, class Comp = ranges::less,
|
||
class Proj = identity>
|
||
requires [sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")<I, Comp, Proj>
|
||
constexpr I
|
||
ranges::partial_sort(I first, I middle, S last, Comp comp = {}, 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 Comp = ranges::less, class Proj = identity>
|
||
requires [sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")<I, Comp, Proj>
|
||
I ranges::partial_sort(Ep&& exec, I first, I middle, S last, Comp comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[1](#partial.sort-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8936)
|
||
|
||
Let comp be less{} and proj be identity{} for the overloads with no parameters by those names[.](#partial.sort-1.sentence-1)
|
||
|
||
[2](#partial.sort-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8941)
|
||
|
||
*Preconditions*: [first, middle) and [middle, last) are valid ranges[.](#partial.sort-2.sentence-1)
|
||
|
||
For the overloads in namespace std,RandomAccessIterator 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[.](#partial.sort-2.sentence-2)
|
||
|
||
[3](#partial.sort-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8951)
|
||
|
||
*Effects*: Places the first middle - first elements
|
||
from the range [first, last)
|
||
as sorted with respect to comp and proj into the range [first, middle)[.](#partial.sort-3.sentence-1)
|
||
|
||
The rest of the elements in the range [middle, last)
|
||
are placed in an unspecified order[.](#partial.sort-3.sentence-2)
|
||
|
||
[4](#partial.sort-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8961)
|
||
|
||
*Returns*: last for the overload in namespace ranges[.](#partial.sort-4.sentence-1)
|
||
|
||
[5](#partial.sort-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8965)
|
||
|
||
*Complexity*: Approximately (last - first) * log(middle - first) comparisons, and
|
||
twice as many projections[.](#partial.sort-5.sentence-1)
|
||
|
||
[ð](#partial.sort-itemdecl:2)
|
||
|
||
`template<[random_access_range](range.refinements#concept:random_access_range "25.4.6 Other range refinements [range.refinements]") R, class Comp = ranges::less, class Proj = identity>
|
||
requires [sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")<iterator_t<R>, Comp, Proj>
|
||
constexpr borrowed_iterator_t<R>
|
||
ranges::partial_sort(R&& r, iterator_t<R> middle, Comp comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[6](#partial.sort-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8979)
|
||
|
||
*Effects*: Equivalent to:return ranges::partial_sort(ranges::begin(r), middle, ranges::end(r), comp, proj);
|
||
|
||
[ð](#partial.sort-itemdecl:3)
|
||
|
||
`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 Comp = ranges::less, class Proj = identity>
|
||
requires [sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")<iterator_t<R>, Comp, Proj>
|
||
borrowed_iterator_t<R>
|
||
ranges::partial_sort(Ep&& exec, R&& r, iterator_t<R> middle, Comp comp = {},
|
||
Proj proj = {});
|
||
`
|
||
|
||
[7](#partial.sort-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8997)
|
||
|
||
*Effects*: Equivalent to:return ranges::partial_sort(std::forward<Ep>(exec), ranges::begin(r), middle,
|
||
ranges::end(r), comp, proj);
|
||
|
||
#### [26.8.2.4](#partial.sort.copy) partial_sort_copy [[partial.sort.copy]](partial.sort.copy)
|
||
|
||
[ð](#lib:partial_sort_copy)
|
||
|
||
`template<class InputIterator, class RandomAccessIterator>
|
||
constexpr RandomAccessIterator
|
||
partial_sort_copy(InputIterator first, InputIterator last,
|
||
RandomAccessIterator result_first,
|
||
RandomAccessIterator result_last);
|
||
template<class ExecutionPolicy, class ForwardIterator, class RandomAccessIterator>
|
||
RandomAccessIterator
|
||
partial_sort_copy(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last,
|
||
RandomAccessIterator result_first,
|
||
RandomAccessIterator result_last);
|
||
|
||
template<class InputIterator, class RandomAccessIterator,
|
||
class Compare>
|
||
constexpr RandomAccessIterator
|
||
partial_sort_copy(InputIterator first, InputIterator last,
|
||
RandomAccessIterator result_first,
|
||
RandomAccessIterator result_last,
|
||
Compare comp);
|
||
template<class ExecutionPolicy, class ForwardIterator, class RandomAccessIterator,
|
||
class Compare>
|
||
RandomAccessIterator
|
||
partial_sort_copy(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last,
|
||
RandomAccessIterator result_first,
|
||
RandomAccessIterator result_last,
|
||
Compare comp);
|
||
|
||
template<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_iterator [iterator.concept.input]") I1, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I1> S1, [random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") I2, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I2> S2,
|
||
class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I1, I2> && [sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")<I2, Comp, Proj2> &&
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<Comp, projected<I1, Proj1>, projected<I2, Proj2>>
|
||
constexpr ranges::partial_sort_copy_result<I1, I2>
|
||
ranges::partial_sort_copy(I1 first, S1 last, I2 result_first, S2 result_last,
|
||
Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {});
|
||
template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R1, [random_access_range](range.refinements#concept:random_access_range "25.4.6 Other range refinements [range.refinements]") R2, class Comp = ranges::less,
|
||
class Proj1 = identity, class Proj2 = identity>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R1>, iterator_t<R2>> &&
|
||
[sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")<iterator_t<R2>, Comp, Proj2> &&
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<Comp, projected<iterator_t<R1>, Proj1>,
|
||
projected<iterator_t<R2>, Proj2>>
|
||
constexpr ranges::partial_sort_copy_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>>
|
||
ranges::partial_sort_copy(R1&& r, R2&& result_r, Comp comp = {},
|
||
Proj1 proj1 = {}, Proj2 proj2 = {});
|
||
|
||
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]") I1, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<I1> S1,
|
||
[random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") I2, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<I2> S2,
|
||
class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I1, I2> && [sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")<I2, Comp, Proj2> &&
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<Comp, projected<I1, Proj1>, projected<I2, Proj2>>
|
||
ranges::partial_sort_copy_result<I1, I2>
|
||
ranges::partial_sort_copy(Ep&& exec, I1 first, S1 last, I2 result_first, S2 result_last,
|
||
Comp comp = {}, Proj1 proj1 = {},
|
||
Proj2 proj2 = {});
|
||
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]") R1, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") R2,
|
||
class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R1>, iterator_t<R2>> &&
|
||
[sortable](alg.req.sortable#concept:sortable "24.3.7.8 Concept sortable [alg.req.sortable]")<iterator_t<R2>, Comp, Proj2> &&
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<Comp, projected<iterator_t<R1>, Proj1>,
|
||
projected<iterator_t<R2>, Proj2>>
|
||
ranges::partial_sort_copy_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>>
|
||
ranges::partial_sort_copy(Ep&& exec, R1&& r, R2&& result_r, Comp comp = {},
|
||
Proj1 proj1 = {}, Proj2 proj2 = {});
|
||
`
|
||
|
||
[1](#partial.sort.copy-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9076)
|
||
|
||
Let N be min(last - first, result_last - result_first)[.](#partial.sort.copy-1.sentence-1)
|
||
|
||
Let comp be less{}, andproj1 and proj2 be identity{} for the overloads with no parameters by those names[.](#partial.sort.copy-1.sentence-2)
|
||
|
||
[2](#partial.sort.copy-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9082)
|
||
|
||
*Mandates*: For the overloads in namespace std,
|
||
the expression *first is writable ([[iterator.requirements.general]](iterator.requirements.general "24.3.1 General")) to result_first[.](#partial.sort.copy-2.sentence-1)
|
||
|
||
[3](#partial.sort.copy-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9088)
|
||
|
||
*Preconditions*: For the overloads in namespace std,RandomAccessIterator 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")),
|
||
the type of *result_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[.](#partial.sort.copy-3.sentence-1)
|
||
|
||
[4](#partial.sort.copy-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9097)
|
||
|
||
For iterators a1 and b1 in [first, last), and
|
||
iterators x2 and y2 in [result_first, result_last),
|
||
after evaluating the assignment *y2 = *b1, let E be the value ofbool(invoke(comp, invoke(proj1, *a1), invoke(proj2, *y2))).
|
||
|
||
Then, after evaluating the assignment *x2 = *a1, E is equal tobool(invoke(comp, invoke(proj2, *x2), invoke(proj2, *y2))).
|
||
|
||
[*Note [1](#partial.sort.copy-note-1)*:
|
||
|
||
Writing a value from the input range into the output range does not affect
|
||
how it is ordered by comp and proj1 or proj2[.](#partial.sort.copy-4.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
[5](#partial.sort.copy-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9113)
|
||
|
||
*Effects*: Places the first N elements
|
||
as sorted with respect to comp and proj2 into the range [result_first, result_first + N)[.](#partial.sort.copy-5.sentence-1)
|
||
|
||
[6](#partial.sort.copy-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9119)
|
||
|
||
*Returns*:
|
||
|
||
- [(6.1)](#partial.sort.copy-6.1)
|
||
|
||
result_first + N for the overloads in namespace std[.](#partial.sort.copy-6.1.sentence-1)
|
||
|
||
- [(6.2)](#partial.sort.copy-6.2)
|
||
|
||
{last, result_first + N} for
|
||
the overloads in namespace ranges[.](#partial.sort.copy-6.2.sentence-1)
|
||
|
||
[7](#partial.sort.copy-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9129)
|
||
|
||
*Complexity*: Approximately (last - first) * log N comparisons,
|
||
and twice as many projections[.](#partial.sort.copy-7.sentence-1)
|
||
|
||
#### [26.8.2.5](#is.sorted) is_sorted [[is.sorted]](is.sorted)
|
||
|
||
[ð](#lib:is_sorted)
|
||
|
||
`template<class ForwardIterator>
|
||
constexpr bool is_sorted(ForwardIterator first, ForwardIterator last);
|
||
`
|
||
|
||
[1](#is.sorted-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9144)
|
||
|
||
*Effects*: Equivalent to: return is_sorted_until(first, last) == last;
|
||
|
||
[ð](#lib:is_sorted_)
|
||
|
||
`template<class ExecutionPolicy, class ForwardIterator>
|
||
bool is_sorted(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last);
|
||
`
|
||
|
||
[2](#is.sorted-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9157)
|
||
|
||
*Effects*: Equivalent to:return is_sorted_until(std::forward<ExecutionPolicy>(exec), first, last) == last;
|
||
|
||
[ð](#lib:is_sorted__)
|
||
|
||
`template<class ForwardIterator, class Compare>
|
||
constexpr bool is_sorted(ForwardIterator first, ForwardIterator last,
|
||
Compare comp);
|
||
`
|
||
|
||
[3](#is.sorted-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9173)
|
||
|
||
*Effects*: Equivalent to: return is_sorted_until(first, last, comp) == last;
|
||
|
||
[ð](#lib:is_sorted___)
|
||
|
||
`template<class ExecutionPolicy, class ForwardIterator, class Compare>
|
||
bool is_sorted(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last,
|
||
Compare comp);
|
||
`
|
||
|
||
[4](#is.sorted-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9188)
|
||
|
||
*Effects*: Equivalent to:return is_sorted_until(std::forward<ExecutionPolicy>(exec), first, last, comp) == last;
|
||
|
||
[ð](#lib:is_sorted____)
|
||
|
||
`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_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Comp = ranges::less>
|
||
constexpr bool ranges::is_sorted(I first, S last, Comp comp = {}, Proj proj = {});
|
||
template<[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Comp = ranges::less>
|
||
constexpr bool ranges::is_sorted(R&& r, Comp comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[5](#is.sorted-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9207)
|
||
|
||
*Effects*: Equivalent to:return ranges::is_sorted_until(first, last, comp, proj) == last;
|
||
|
||
[ð](#is.sorted-itemdecl:6)
|
||
|
||
`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_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Comp = ranges::less>
|
||
bool ranges::is_sorted(Ep&& exec, I first, S last, Comp comp = {}, 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_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Comp = ranges::less>
|
||
bool ranges::is_sorted(Ep&& exec, R&& r, Comp comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[6](#is.sorted-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9224)
|
||
|
||
*Effects*: Equivalent to:return ranges::is_sorted_until(std::forward<Ep>(exec), first, last, comp, proj) == last;
|
||
|
||
[ð](#lib:is_sorted_until)
|
||
|
||
`template<class ForwardIterator>
|
||
constexpr ForwardIterator
|
||
is_sorted_until(ForwardIterator first, ForwardIterator last);
|
||
template<class ExecutionPolicy, class ForwardIterator>
|
||
ForwardIterator
|
||
is_sorted_until(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last);
|
||
|
||
template<class ForwardIterator, class Compare>
|
||
constexpr ForwardIterator
|
||
is_sorted_until(ForwardIterator first, ForwardIterator last,
|
||
Compare comp);
|
||
template<class ExecutionPolicy, class ForwardIterator, class Compare>
|
||
ForwardIterator
|
||
is_sorted_until(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last,
|
||
Compare comp);
|
||
|
||
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_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Comp = ranges::less>
|
||
constexpr I ranges::is_sorted_until(I first, S last, Comp comp = {}, Proj proj = {});
|
||
template<[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Comp = ranges::less>
|
||
constexpr borrowed_iterator_t<R>
|
||
ranges::is_sorted_until(R&& r, Comp comp = {}, 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_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Comp = ranges::less>
|
||
I ranges::is_sorted_until(Ep&& exec, I first, S last, Comp comp = {},
|
||
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_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Comp = ranges::less>
|
||
borrowed_iterator_t<R>
|
||
ranges::is_sorted_until(Ep&& exec, R&& r, Comp comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[7](#is.sorted-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9272)
|
||
|
||
Let comp be less{} and proj be identity{} for the overloads with no parameters by those names[.](#is.sorted-7.sentence-1)
|
||
|
||
[8](#is.sorted-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9277)
|
||
|
||
*Returns*: The last iterator i in [first, last]
|
||
for which the range [first, i)
|
||
is sorted with respect to comp and proj[.](#is.sorted-8.sentence-1)
|
||
|
||
[9](#is.sorted-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L9283)
|
||
|
||
*Complexity*: Linear[.](#is.sorted-9.sentence-1)
|