2714 lines
166 KiB
Markdown
2714 lines
166 KiB
Markdown
[alg.modifying.operations]
|
||
|
||
# 26 Algorithms library [[algorithms]](./#algorithms)
|
||
|
||
## 26.7 Mutating sequence operations [alg.modifying.operations]
|
||
|
||
### [26.7.1](#alg.copy) Copy [[alg.copy]](alg.copy)
|
||
|
||
[ð](#lib:copy)
|
||
|
||
`template<class InputIterator, class OutputIterator>
|
||
constexpr OutputIterator copy(InputIterator first, InputIterator last,
|
||
OutputIterator result);
|
||
|
||
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]") O>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O>
|
||
constexpr ranges::copy_result<I, O> ranges::copy(I first, S last, O result);
|
||
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]") O>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, O>
|
||
constexpr ranges::copy_result<borrowed_iterator_t<R>, O> ranges::copy(R&& r, O result);
|
||
`
|
||
|
||
[1](#alg.copy-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6361)
|
||
|
||
Let N be last - first[.](#alg.copy-1.sentence-1)
|
||
|
||
[2](#alg.copy-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6364)
|
||
|
||
*Preconditions*: result is not in the range [first, last)[.](#alg.copy-2.sentence-1)
|
||
|
||
[3](#alg.copy-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6368)
|
||
|
||
*Effects*: Copies elements in the range [first, last)
|
||
into the range [result, result + N)
|
||
starting from first and proceeding to last[.](#alg.copy-3.sentence-1)
|
||
|
||
For each non-negative integer n<N,
|
||
performs *(result + n) = *(first + n)[.](#alg.copy-3.sentence-2)
|
||
|
||
[4](#alg.copy-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6376)
|
||
|
||
*Returns*:
|
||
|
||
- [(4.1)](#alg.copy-4.1)
|
||
|
||
result + N for the overload in namespace std[.](#alg.copy-4.1.sentence-1)
|
||
|
||
- [(4.2)](#alg.copy-4.2)
|
||
|
||
{last, result + N} for the overloads in namespace ranges[.](#alg.copy-4.2.sentence-1)
|
||
|
||
[5](#alg.copy-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6385)
|
||
|
||
*Complexity*: Exactly N assignments[.](#alg.copy-5.sentence-1)
|
||
|
||
[ð](#lib:copy_)
|
||
|
||
`template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
|
||
ForwardIterator2 copy(ExecutionPolicy&& exec,
|
||
ForwardIterator1 first, ForwardIterator1 last,
|
||
ForwardIterator2 result);
|
||
|
||
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]") O, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O> OutS>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O>
|
||
ranges::copy_result<I, O>
|
||
ranges::copy(Ep&& exec, I first, S last, O result, OutS result_last);
|
||
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]") OutR>
|
||
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<OutR>>
|
||
ranges::copy_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
|
||
ranges::copy(Ep&& exec, R&& r, OutR&& result_r);
|
||
`
|
||
|
||
[6](#alg.copy-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6409)
|
||
|
||
Let result_last be result + (last - first) for the overload in namespace std[.](#alg.copy-6.sentence-1)
|
||
|
||
[7](#alg.copy-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6413)
|
||
|
||
Let N be min(last - first, result_last - result)[.](#alg.copy-7.sentence-1)
|
||
|
||
[8](#alg.copy-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6416)
|
||
|
||
*Preconditions*: The ranges [first, last) and [result, result + N)
|
||
do not overlap[.](#alg.copy-8.sentence-1)
|
||
|
||
[9](#alg.copy-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6421)
|
||
|
||
*Effects*: Copies elements in the range [first, first + N)
|
||
into the range [result, result + N)[.](#alg.copy-9.sentence-1)
|
||
|
||
For each non-negative integer n<N,
|
||
performs *(result + n) = *(first + n)[.](#alg.copy-9.sentence-2)
|
||
|
||
[10](#alg.copy-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6428)
|
||
|
||
*Returns*:
|
||
|
||
- [(10.1)](#alg.copy-10.1)
|
||
|
||
result + N for the overload in namespace std[.](#alg.copy-10.1.sentence-1)
|
||
|
||
- [(10.2)](#alg.copy-10.2)
|
||
|
||
{first + N, result + N} for the overloads in namespace ranges[.](#alg.copy-10.2.sentence-1)
|
||
|
||
[11](#alg.copy-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6437)
|
||
|
||
*Complexity*: Exactly N assignments[.](#alg.copy-11.sentence-1)
|
||
|
||
[ð](#lib:copy_n)
|
||
|
||
`template<class InputIterator, class Size, class OutputIterator>
|
||
constexpr OutputIterator copy_n(InputIterator first, Size n,
|
||
OutputIterator result);
|
||
template<class ExecutionPolicy, class ForwardIterator1, class Size, class ForwardIterator2>
|
||
ForwardIterator2 copy_n(ExecutionPolicy&& exec,
|
||
ForwardIterator1 first, Size n,
|
||
ForwardIterator2 result);
|
||
|
||
template<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_iterator [iterator.concept.input]") I, [weakly_incrementable](iterator.concept.winc#concept:weakly_incrementable "24.3.4.4 Concept weakly_incrementable [iterator.concept.winc]") O>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O>
|
||
constexpr ranges::copy_n_result<I, O>
|
||
ranges::copy_n(I first, iter_difference_t<I> n, O result);
|
||
|
||
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, [random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") O,
|
||
[sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O> OutS>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O>
|
||
ranges::copy_n_result<I, O>
|
||
ranges::copy_n(Ep&& exec, I first, iter_difference_t<I> n, O result, OutS result_last);
|
||
`
|
||
|
||
[12](#alg.copy-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6465)
|
||
|
||
Let M be max(0, n)[.](#alg.copy-12.sentence-1)
|
||
|
||
[13](#alg.copy-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6468)
|
||
|
||
Let result_last be result + M for the overloads with no parameter result_last[.](#alg.copy-13.sentence-1)
|
||
|
||
[14](#alg.copy-14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6472)
|
||
|
||
Let N be min(result_last - result,M)[.](#alg.copy-14.sentence-1)
|
||
|
||
[15](#alg.copy-15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6475)
|
||
|
||
*Mandates*: The type Size is convertible
|
||
to an integral type ([[conv.integral]](conv.integral "7.3.9 Integral conversions"), [[class.conv]](class.conv "11.4.8 Conversions"))[.](#alg.copy-15.sentence-1)
|
||
|
||
[16](#alg.copy-16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6480)
|
||
|
||
*Effects*: For each non-negative integer i<N,
|
||
performs *(result + i) = *(first + i)[.](#alg.copy-16.sentence-1)
|
||
|
||
[17](#alg.copy-17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6485)
|
||
|
||
*Returns*:
|
||
|
||
- [(17.1)](#alg.copy-17.1)
|
||
|
||
result + N for the overloads in namespace std[.](#alg.copy-17.1.sentence-1)
|
||
|
||
- [(17.2)](#alg.copy-17.2)
|
||
|
||
{first + N, result + N} for the overload in namespace ranges[.](#alg.copy-17.2.sentence-1)
|
||
|
||
[18](#alg.copy-18)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6496)
|
||
|
||
*Complexity*: Exactly N assignments[.](#alg.copy-18.sentence-1)
|
||
|
||
[ð](#lib:copy_if)
|
||
|
||
`template<class InputIterator, class OutputIterator, class Predicate>
|
||
constexpr OutputIterator copy_if(InputIterator first, InputIterator last,
|
||
OutputIterator result, Predicate pred);
|
||
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
|
||
class Predicate>
|
||
ForwardIterator2 copy_if(ExecutionPolicy&& exec,
|
||
ForwardIterator1 first, ForwardIterator1 last,
|
||
ForwardIterator2 result, 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]") O, 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, O>
|
||
constexpr ranges::copy_if_result<I, O>
|
||
ranges::copy_if(I first, S last, O result, 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]") O, 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>, O>
|
||
constexpr ranges::copy_if_result<borrowed_iterator_t<R>, O>
|
||
ranges::copy_if(R&& r, O result, 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]") O, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O> OutS,
|
||
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, O>
|
||
ranges::copy_if_result<I, O>
|
||
ranges::copy_if(Ep&& exec, I first, S last, O result, OutS result_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, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") OutR,
|
||
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<OutR>>
|
||
ranges::copy_if_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
|
||
ranges::copy_if(Ep&& exec, R&& r, OutR&& result_r, Pred pred, Proj proj = {});
|
||
`
|
||
|
||
[19](#alg.copy-19)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6539)
|
||
|
||
Let E(i) be:
|
||
|
||
- [(19.1)](#alg.copy-19.1)
|
||
|
||
bool(pred(*i)) for the overloads in namespace std;
|
||
|
||
- [(19.2)](#alg.copy-19.2)
|
||
|
||
bool(invoke(pred, invoke(proj, *i))) for the overloads in namespace ranges[.](#alg.copy-19.sentence-1)
|
||
|
||
[20](#alg.copy-20)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6550)
|
||
|
||
Let:
|
||
|
||
- [(20.1)](#alg.copy-20.1)
|
||
|
||
M be the number of iterators i in the range [first, last)
|
||
for which the condition E(i) holds;
|
||
|
||
- [(20.2)](#alg.copy-20.2)
|
||
|
||
result_last be result + M for the overloads with no parameter result_last or result_r;
|
||
|
||
- [(20.3)](#alg.copy-20.3)
|
||
|
||
N be min(M, result_last - result)[.](#alg.copy-20.sentence-1)
|
||
|
||
[21](#alg.copy-21)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6563)
|
||
|
||
*Preconditions*: The ranges [first, last) and [result, result + N)
|
||
do not overlap[.](#alg.copy-21.sentence-1)
|
||
|
||
[*Note [1](#alg.copy-note-1)*:
|
||
|
||
For the parallel algorithm overload in namespace std,
|
||
there can be a performance cost
|
||
if iterator_traits<ForwardIterator1>::value_type does not meet the *Cpp17MoveConstructible* (Table [31](utility.arg.requirements#tab:cpp17.moveconstructible "Table 31: Cpp17MoveConstructible requirements")) requirements[.](#alg.copy-21.sentence-2)
|
||
|
||
For the parallel algorithm overloads in namespace ranges,
|
||
there can be a performance cost
|
||
if iter_value_t<I> does not model [move_constructible](concept.moveconstructible#concept:move_constructible "18.4.13 Concept move_constructible [concept.moveconstructible]")[.](#alg.copy-21.sentence-3)
|
||
|
||
â *end note*]
|
||
|
||
[22](#alg.copy-22)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6577)
|
||
|
||
*Effects*: Copies the first N elements referred to
|
||
by the iterator i in the range [first, last)
|
||
for which E(i) is true into the range [result, result + N)[.](#alg.copy-22.sentence-1)
|
||
|
||
[23](#alg.copy-23)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6584)
|
||
|
||
*Returns*:
|
||
|
||
- [(23.1)](#alg.copy-23.1)
|
||
|
||
result + N for the overloads in namespace std[.](#alg.copy-23.1.sentence-1)
|
||
|
||
- [(23.2)](#alg.copy-23.2)
|
||
|
||
{last, result + N} for the overloads in namespace ranges, if N is equal to M[.](#alg.copy-23.2.sentence-1)
|
||
|
||
- [(23.3)](#alg.copy-23.3)
|
||
|
||
Otherwise, {j, result_last} for the overloads in namespace ranges,
|
||
where j is the iterator in [first, last)
|
||
for which E(j) holds
|
||
and there are exactly N iterators i in [first, j) for which E(i) holds[.](#alg.copy-23.3.sentence-1)
|
||
|
||
[24](#alg.copy-24)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6602)
|
||
|
||
*Complexity*: At most last - first applications
|
||
of the corresponding predicate and any projection[.](#alg.copy-24.sentence-1)
|
||
|
||
[25](#alg.copy-25)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6607)
|
||
|
||
*Remarks*: Stable ([[algorithm.stable]](algorithm.stable "16.4.6.8 Requirements for stable algorithms"))[.](#alg.copy-25.sentence-1)
|
||
|
||
[ð](#lib:copy_backward)
|
||
|
||
`template<class BidirectionalIterator1, class BidirectionalIterator2>
|
||
constexpr BidirectionalIterator2
|
||
copy_backward(BidirectionalIterator1 first,
|
||
BidirectionalIterator1 last,
|
||
BidirectionalIterator2 result);
|
||
|
||
template<[bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12 Concept bidirectional_iterator [iterator.concept.bidir]") I1, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I1> S1, [bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12 Concept bidirectional_iterator [iterator.concept.bidir]") I2>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I1, I2>
|
||
constexpr ranges::copy_backward_result<I1, I2>
|
||
ranges::copy_backward(I1 first, S1 last, I2 result);
|
||
template<[bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6 Other range refinements [range.refinements]") R, [bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12 Concept bidirectional_iterator [iterator.concept.bidir]") I>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, I>
|
||
constexpr ranges::copy_backward_result<borrowed_iterator_t<R>, I>
|
||
ranges::copy_backward(R&& r, I result);
|
||
`
|
||
|
||
[26](#alg.copy-26)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6631)
|
||
|
||
Let N be last - first[.](#alg.copy-26.sentence-1)
|
||
|
||
[27](#alg.copy-27)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6634)
|
||
|
||
*Preconditions*: result is not in the range (first, last][.](#alg.copy-27.sentence-1)
|
||
|
||
[28](#alg.copy-28)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6638)
|
||
|
||
*Effects*: Copies elements in the range [first, last)
|
||
into the range [result - N, result)
|
||
starting from last - 1 and proceeding to first[.](#alg.copy-28.sentence-1)[201](#footnote-201 "copy_backward can be used instead of copy when last is in the range [result - N, result).")
|
||
|
||
For each positive integer n ⤠N,
|
||
performs *(result - n) = *(last - n)[.](#alg.copy-28.sentence-2)
|
||
|
||
[29](#alg.copy-29)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6650)
|
||
|
||
*Returns*:
|
||
|
||
- [(29.1)](#alg.copy-29.1)
|
||
|
||
result - N for the overload in namespace std[.](#alg.copy-29.1.sentence-1)
|
||
|
||
- [(29.2)](#alg.copy-29.2)
|
||
|
||
{last, result - N} for the overloads in namespace ranges[.](#alg.copy-29.2.sentence-1)
|
||
|
||
[30](#alg.copy-30)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6661)
|
||
|
||
*Complexity*: Exactly N assignments[.](#alg.copy-30.sentence-1)
|
||
|
||
[201)](#footnote-201)[201)](#footnoteref-201)
|
||
|
||
copy_backward can be used instead of copy when last is in the range [result - N, result)[.](#footnote-201.sentence-1)
|
||
|
||
### [26.7.2](#alg.move) Move [[alg.move]](alg.move)
|
||
|
||
[ð](#lib:move,algorithm)
|
||
|
||
`template<class InputIterator, class OutputIterator>
|
||
constexpr OutputIterator move(InputIterator first, InputIterator last,
|
||
OutputIterator result);
|
||
|
||
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]") O>
|
||
requires [indirectly_movable](alg.req.ind.move#concept:indirectly_movable "24.3.7.2 Concept indirectly_movable [alg.req.ind.move]")<I, O>
|
||
constexpr ranges::move_result<I, O>
|
||
ranges::move(I first, S last, O result);
|
||
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]") O>
|
||
requires [indirectly_movable](alg.req.ind.move#concept:indirectly_movable "24.3.7.2 Concept indirectly_movable [alg.req.ind.move]")<iterator_t<R>, O>
|
||
constexpr ranges::move_result<borrowed_iterator_t<R>, O>
|
||
ranges::move(R&& r, O result);
|
||
`
|
||
|
||
[1](#alg.move-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6685)
|
||
|
||
Let E(n) be
|
||
|
||
- [(1.1)](#alg.move-1.1)
|
||
|
||
std::move(*(first + n)) for the overload in namespace std;
|
||
|
||
- [(1.2)](#alg.move-1.2)
|
||
|
||
ranges::iter_move(first + n) for the overloads in namespace ranges[.](#alg.move-1.sentence-1)
|
||
|
||
Let N be last - first[.](#alg.move-1.sentence-2)
|
||
|
||
[2](#alg.move-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6697)
|
||
|
||
*Preconditions*: result is not in the range [first, last)[.](#alg.move-2.sentence-1)
|
||
|
||
[3](#alg.move-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6701)
|
||
|
||
*Effects*: Moves elements in the range [first, last)
|
||
into the range [result, result + N)
|
||
starting from first and proceeding to last[.](#alg.move-3.sentence-1)
|
||
|
||
For each non-negative integer n<N, performs *(result + n) = E(n)[.](#alg.move-3.sentence-2)
|
||
|
||
[4](#alg.move-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6708)
|
||
|
||
*Returns*:
|
||
|
||
- [(4.1)](#alg.move-4.1)
|
||
|
||
result + N for the overload in namespace std[.](#alg.move-4.1.sentence-1)
|
||
|
||
- [(4.2)](#alg.move-4.2)
|
||
|
||
{last, result + N} for the overloads in namespace ranges[.](#alg.move-4.2.sentence-1)
|
||
|
||
[5](#alg.move-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6719)
|
||
|
||
*Complexity*: Exactly N assignments[.](#alg.move-5.sentence-1)
|
||
|
||
[ð](#lib:move,algorithm_)
|
||
|
||
`template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
|
||
ForwardIterator2 move(ExecutionPolicy&& exec,
|
||
ForwardIterator1 first, ForwardIterator1 last,
|
||
ForwardIterator2 result);
|
||
|
||
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]") O, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O> OutS>
|
||
requires [indirectly_movable](alg.req.ind.move#concept:indirectly_movable "24.3.7.2 Concept indirectly_movable [alg.req.ind.move]")<I, O>
|
||
ranges::move_result<I, O>
|
||
ranges::move(Ep&& exec, I first, S last, O result, OutS result_last);
|
||
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]") OutR>
|
||
requires [indirectly_movable](alg.req.ind.move#concept:indirectly_movable "24.3.7.2 Concept indirectly_movable [alg.req.ind.move]")<iterator_t<R>, iterator_t<OutR>>
|
||
ranges::move_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
|
||
ranges::move(Ep&& exec, R&& r, OutR&& result_r);
|
||
`
|
||
|
||
[6](#alg.move-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6743)
|
||
|
||
Let E(n) be:
|
||
|
||
- [(6.1)](#alg.move-6.1)
|
||
|
||
std::move(*(first + n)) for the overload in namespace std;
|
||
|
||
- [(6.2)](#alg.move-6.2)
|
||
|
||
ranges::iter_move(first + n) for the overloads in namespace ranges[.](#alg.move-6.sentence-1)
|
||
|
||
[7](#alg.move-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6754)
|
||
|
||
Let result_last be result + (last - first) for the overloads in namespace std[.](#alg.move-7.sentence-1)
|
||
|
||
[8](#alg.move-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6758)
|
||
|
||
Let N be min(last - first, result_last - result)[.](#alg.move-8.sentence-1)
|
||
|
||
[9](#alg.move-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6761)
|
||
|
||
*Preconditions*: The ranges [first, last) and [result, result + N)
|
||
do not overlap[.](#alg.move-9.sentence-1)
|
||
|
||
[10](#alg.move-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6766)
|
||
|
||
*Effects*: Moves elements in the range [first, first + N)
|
||
into the range [result, result + N)[.](#alg.move-10.sentence-1)
|
||
|
||
For each non-negative integer n<N,
|
||
performs *(result + n) = E(n)[.](#alg.move-10.sentence-2)
|
||
|
||
[11](#alg.move-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6773)
|
||
|
||
*Returns*:
|
||
|
||
- [(11.1)](#alg.move-11.1)
|
||
|
||
result + N for the overload in namespace std[.](#alg.move-11.1.sentence-1)
|
||
|
||
- [(11.2)](#alg.move-11.2)
|
||
|
||
{first + N, result + N} for the overloads in namespace ranges[.](#alg.move-11.2.sentence-1)
|
||
|
||
[12](#alg.move-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6784)
|
||
|
||
*Complexity*: Exactly N assignments[.](#alg.move-12.sentence-1)
|
||
|
||
[ð](#lib:move_backward)
|
||
|
||
`template<class BidirectionalIterator1, class BidirectionalIterator2>
|
||
constexpr BidirectionalIterator2
|
||
move_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
|
||
BidirectionalIterator2 result);
|
||
|
||
template<[bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12 Concept bidirectional_iterator [iterator.concept.bidir]") I1, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I1> S1, [bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12 Concept bidirectional_iterator [iterator.concept.bidir]") I2>
|
||
requires [indirectly_movable](alg.req.ind.move#concept:indirectly_movable "24.3.7.2 Concept indirectly_movable [alg.req.ind.move]")<I1, I2>
|
||
constexpr ranges::move_backward_result<I1, I2>
|
||
ranges::move_backward(I1 first, S1 last, I2 result);
|
||
template<[bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6 Other range refinements [range.refinements]") R, [bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12 Concept bidirectional_iterator [iterator.concept.bidir]") I>
|
||
requires [indirectly_movable](alg.req.ind.move#concept:indirectly_movable "24.3.7.2 Concept indirectly_movable [alg.req.ind.move]")<iterator_t<R>, I>
|
||
constexpr ranges::move_backward_result<borrowed_iterator_t<R>, I>
|
||
ranges::move_backward(R&& r, I result);
|
||
`
|
||
|
||
[13](#alg.move-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6807)
|
||
|
||
Let E(n) be
|
||
|
||
- [(13.1)](#alg.move-13.1)
|
||
|
||
std::move(*(last - n)) for the overload in namespace std;
|
||
|
||
- [(13.2)](#alg.move-13.2)
|
||
|
||
ranges::iter_move(last - n) for the overloads in namespace ranges[.](#alg.move-13.sentence-1)
|
||
|
||
Let N be last - first[.](#alg.move-13.sentence-2)
|
||
|
||
[14](#alg.move-14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6819)
|
||
|
||
*Preconditions*: result is not in the range (first, last][.](#alg.move-14.sentence-1)
|
||
|
||
[15](#alg.move-15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6823)
|
||
|
||
*Effects*: Moves elements in the range [first, last)
|
||
into the range [result - N, result)
|
||
starting from last - 1 and proceeding to first[.](#alg.move-15.sentence-1)[202](#footnote-202 "move_backward can be used instead of move when last is in the range [result - N, result).")
|
||
|
||
For each positive integer n ⤠N,
|
||
performs *(result - n) = E(n)[.](#alg.move-15.sentence-2)
|
||
|
||
[16](#alg.move-16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6835)
|
||
|
||
*Returns*:
|
||
|
||
- [(16.1)](#alg.move-16.1)
|
||
|
||
result - N for the overload in namespace std[.](#alg.move-16.1.sentence-1)
|
||
|
||
- [(16.2)](#alg.move-16.2)
|
||
|
||
{last, result - N} for the overloads in namespace ranges[.](#alg.move-16.2.sentence-1)
|
||
|
||
[17](#alg.move-17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6846)
|
||
|
||
*Complexity*: Exactly N assignments[.](#alg.move-17.sentence-1)
|
||
|
||
[202)](#footnote-202)[202)](#footnoteref-202)
|
||
|
||
move_backward can be used instead of move when last is in the range [result - N, result)[.](#footnote-202.sentence-1)
|
||
|
||
### [26.7.3](#alg.swap) Swap [[alg.swap]](alg.swap)
|
||
|
||
[ð](#lib:swap_ranges)
|
||
|
||
`template<class ForwardIterator1, class ForwardIterator2>
|
||
constexpr ForwardIterator2
|
||
swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1,
|
||
ForwardIterator2 first2);
|
||
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
|
||
ForwardIterator2
|
||
swap_ranges(ExecutionPolicy&& exec,
|
||
ForwardIterator1 first1, ForwardIterator1 last1,
|
||
ForwardIterator2 first2);
|
||
|
||
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, [input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_iterator [iterator.concept.input]") I2, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I2> S2>
|
||
requires [indirectly_swappable](alg.req.ind.swap#concept:indirectly_swappable "24.3.7.4 Concept indirectly_swappable [alg.req.ind.swap]")<I1, I2>
|
||
constexpr ranges::swap_ranges_result<I1, I2>
|
||
ranges::swap_ranges(I1 first1, S1 last1, I2 first2, S2 last2);
|
||
template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R1, [input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R2>
|
||
requires [indirectly_swappable](alg.req.ind.swap#concept:indirectly_swappable "24.3.7.4 Concept indirectly_swappable [alg.req.ind.swap]")<iterator_t<R1>, iterator_t<R2>>
|
||
constexpr ranges::swap_ranges_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>>
|
||
ranges::swap_ranges(R1&& r1, R2&& r2);
|
||
|
||
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>
|
||
requires [indirectly_swappable](alg.req.ind.swap#concept:indirectly_swappable "24.3.7.4 Concept indirectly_swappable [alg.req.ind.swap]")<I1, I2>
|
||
ranges::swap_ranges_result<I1, I2>
|
||
ranges::swap_ranges(Ep&& exec, I1 first1, S1 last1, I2 first2, S2 last2);
|
||
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>
|
||
requires [indirectly_swappable](alg.req.ind.swap#concept:indirectly_swappable "24.3.7.4 Concept indirectly_swappable [alg.req.ind.swap]")<iterator_t<R1>, iterator_t<R2>>
|
||
ranges::swap_ranges_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>>
|
||
ranges::swap_ranges(Ep&& exec, R1&& r1, R2&& r2);
|
||
`
|
||
|
||
[1](#alg.swap-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6886)
|
||
|
||
Let:
|
||
|
||
- [(1.1)](#alg.swap-1.1)
|
||
|
||
last2 be first2 + (last1 - first1) for the overloads in namespace std with no parameter named last2;
|
||
|
||
- [(1.2)](#alg.swap-1.2)
|
||
|
||
M be min(last1 - first1, last2 - first2)[.](#alg.swap-1.sentence-1)
|
||
|
||
[2](#alg.swap-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6896)
|
||
|
||
*Preconditions*: The two ranges [first1, last1) and [first2, last2)
|
||
do not overlap[.](#alg.swap-2.sentence-1)
|
||
|
||
For the overloads in namespace std,*(first1 + n) is swappable with ([[swappable.requirements]](swappable.requirements "16.4.4.3 Swappable requirements"))*(first2 + n)[.](#alg.swap-2.sentence-2)
|
||
|
||
[3](#alg.swap-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6904)
|
||
|
||
*Effects*: For each non-negative integer n<M performs:
|
||
|
||
- [(3.1)](#alg.swap-3.1)
|
||
|
||
swap(*(first1 + n), *(first2 + n)) for the overloads in namespace std;
|
||
|
||
- [(3.2)](#alg.swap-3.2)
|
||
|
||
ranges::iter_swap(first1 + n, first2 + n) for the overloads in namespace ranges[.](#alg.swap-3.sentence-1)
|
||
|
||
[4](#alg.swap-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6916)
|
||
|
||
*Returns*:
|
||
|
||
- [(4.1)](#alg.swap-4.1)
|
||
|
||
last2 for the overloads in namespace std[.](#alg.swap-4.1.sentence-1)
|
||
|
||
- [(4.2)](#alg.swap-4.2)
|
||
|
||
{first1 + M, first2 + M} for the overloads in namespace ranges[.](#alg.swap-4.2.sentence-1)
|
||
|
||
[5](#alg.swap-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6927)
|
||
|
||
*Complexity*: Exactly M swaps[.](#alg.swap-5.sentence-1)
|
||
|
||
[ð](#lib:iter_swap)
|
||
|
||
`template<class ForwardIterator1, class ForwardIterator2>
|
||
constexpr void iter_swap(ForwardIterator1 a, ForwardIterator2 b);
|
||
`
|
||
|
||
[6](#alg.swap-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6939)
|
||
|
||
*Preconditions*: a and b are dereferenceable[.](#alg.swap-6.sentence-1)
|
||
|
||
*a is
|
||
swappable with ([[swappable.requirements]](swappable.requirements "16.4.4.3 Swappable requirements")) *b[.](#alg.swap-6.sentence-2)
|
||
|
||
[7](#alg.swap-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L6944)
|
||
|
||
*Effects*: As if by swap(*a, *b)[.](#alg.swap-7.sentence-1)
|
||
|
||
### [26.7.4](#alg.transform) Transform [[alg.transform]](alg.transform)
|
||
|
||
[ð](#lib:transform)
|
||
|
||
`template<class InputIterator, class OutputIterator,
|
||
class UnaryOperation>
|
||
constexpr OutputIterator
|
||
transform(InputIterator first1, InputIterator last1,
|
||
OutputIterator result, UnaryOperation op);
|
||
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
|
||
class UnaryOperation>
|
||
ForwardIterator2
|
||
transform(ExecutionPolicy&& exec,
|
||
ForwardIterator1 first1, ForwardIterator1 last1,
|
||
ForwardIterator2 result, UnaryOperation op);
|
||
|
||
template<class InputIterator1, class InputIterator2,
|
||
class OutputIterator, class BinaryOperation>
|
||
constexpr OutputIterator
|
||
transform(InputIterator1 first1, InputIterator1 last1,
|
||
InputIterator2 first2, OutputIterator result,
|
||
BinaryOperation binary_op);
|
||
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
|
||
class ForwardIterator, class BinaryOperation>
|
||
ForwardIterator
|
||
transform(ExecutionPolicy&& exec,
|
||
ForwardIterator1 first1, ForwardIterator1 last1,
|
||
ForwardIterator2 first2, ForwardIterator result,
|
||
BinaryOperation binary_op);
|
||
|
||
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]") O,
|
||
[copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_constructible [concept.copyconstructible]") F, class Proj = identity>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<O, indirect_result_t<F&, projected<I, Proj>>>
|
||
constexpr ranges::unary_transform_result<I, O>
|
||
ranges::transform(I first1, S last1, O result, F op, 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]") O, [copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_constructible [concept.copyconstructible]") F,
|
||
class Proj = identity>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<O, indirect_result_t<F&, projected<iterator_t<R>, Proj>>>
|
||
constexpr ranges::unary_transform_result<borrowed_iterator_t<R>, O>
|
||
ranges::transform(R&& r, O result, F op, 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]") O, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O> OutS,
|
||
[copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_constructible [concept.copyconstructible]") F, class Proj = identity>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<O, indirect_result_t<F&, projected<I, Proj>>>
|
||
ranges::unary_transform_result<I, O>
|
||
ranges::transform(Ep&& exec, I first1, S last1, O result, OutS result_last,
|
||
F op, 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]") OutR,
|
||
[copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_constructible [concept.copyconstructible]") F, class Proj = identity>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<iterator_t<OutR>,
|
||
indirect_result_t<F&, projected<iterator_t<R>, Proj>>>
|
||
ranges::unary_transform_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
|
||
ranges::transform(Ep&& exec, R&& r, OutR&& result_r, F op, Proj proj = {});
|
||
|
||
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, [input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_iterator [iterator.concept.input]") I2, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I2> S2,
|
||
[weakly_incrementable](iterator.concept.winc#concept:weakly_incrementable "24.3.4.4 Concept weakly_incrementable [iterator.concept.winc]") O, [copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_constructible [concept.copyconstructible]") F, class Proj1 = identity,
|
||
class Proj2 = identity>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<O, indirect_result_t<F&, projected<I1, Proj1>,
|
||
projected<I2, Proj2>>>
|
||
constexpr ranges::binary_transform_result<I1, I2, O>
|
||
ranges::transform(I1 first1, S1 last1, I2 first2, S2 last2, O result,
|
||
F binary_op, Proj1 proj1 = {}, Proj2 proj2 = {});
|
||
template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R1, [input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R2, [weakly_incrementable](iterator.concept.winc#concept:weakly_incrementable "24.3.4.4 Concept weakly_incrementable [iterator.concept.winc]") O,
|
||
[copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_constructible [concept.copyconstructible]") F, class Proj1 = identity, class Proj2 = identity>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<O, indirect_result_t<F&, projected<iterator_t<R1>, Proj1>,
|
||
projected<iterator_t<R2>, Proj2>>>
|
||
constexpr ranges::binary_transform_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O>
|
||
ranges::transform(R1&& r1, R2&& r2, O result,
|
||
F binary_op, 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,
|
||
[random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") O, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O> OutS,
|
||
[copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_constructible [concept.copyconstructible]") F, class Proj1 = identity, class Proj2 = identity>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<O, indirect_result_t<F&, projected<I1, Proj1>,
|
||
projected<I2, Proj2>>>
|
||
ranges::binary_transform_result<I1, I2, O>
|
||
ranges::transform(Ep&& exec, I1 first1, S1 last1, I2 first2, S2 last2,
|
||
O result, OutS result_last,
|
||
F binary_op, 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,
|
||
[sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") OutR, [copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_constructible [concept.copyconstructible]") F,
|
||
class Proj1 = identity, class Proj2 = identity>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<iterator_t<OutR>,
|
||
indirect_result_t<F&, projected<iterator_t<R1>, Proj1>,
|
||
projected<iterator_t<R2>, Proj2>>>
|
||
ranges::binary_transform_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>,
|
||
borrowed_iterator_t<OutR>>
|
||
ranges::transform(Ep&& exec, R1&& r1, R2&& r2, OutR&& result_r,
|
||
F binary_op, Proj1 proj1 = {}, Proj2 proj2 = {});
|
||
`
|
||
|
||
[1](#alg.transform-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7043)
|
||
|
||
Let:
|
||
|
||
- [(1.1)](#alg.transform-1.1)
|
||
|
||
last2 be first2 + (last1 - first1) for the overloads in namespace std with parameter first2 but no parameter last2;
|
||
|
||
- [(1.2)](#alg.transform-1.2)
|
||
|
||
M be last1 - first1 for unary transforms, or min(last1 - first1, last2 - first2) for binary transforms;
|
||
|
||
- [(1.3)](#alg.transform-1.3)
|
||
|
||
result_last be result + M for the overloads with no parameter result_last or result_r;
|
||
|
||
- [(1.4)](#alg.transform-1.4)
|
||
|
||
N be min(M, result_last - result);
|
||
|
||
- [(1.5)](#alg.transform-1.5)
|
||
|
||
E(i) be
|
||
* [(1.5.1)](#alg.transform-1.5.1)
|
||
|
||
op(*(first1 + (i - result))) for unary transforms defined in namespace std;
|
||
|
||
* [(1.5.2)](#alg.transform-1.5.2)
|
||
|
||
binary_op(*(first1 + (i - result)), *(first2 + (i - result))) for binary transforms defined in namespace std;
|
||
|
||
* [(1.5.3)](#alg.transform-1.5.3)
|
||
|
||
invoke(op, invoke(proj, *(first1 + (i - result)))) for unary transforms defined in namespace ranges;
|
||
|
||
* [(1.5.4)](#alg.transform-1.5.4)
|
||
|
||
invoke(binary_op, invoke(proj1, *(first1 + (i - result))), invoke(proj2, *(first2 + (i - result)))) for binary transforms defined in namespace ranges[.](#alg.transform-1.sentence-1)
|
||
|
||
[2](#alg.transform-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7078)
|
||
|
||
*Preconditions*: For parallel algorithm overloadsop and binary_op satisfy the requirements
|
||
specified in [[algorithms.parallel.user]](algorithms.parallel.user "26.3.2 Requirements on user-provided function objects")[.](#alg.transform-2.sentence-1)
|
||
|
||
op and binary_op do not invalidate iterators or subranges, nor
|
||
modify elements in the ranges
|
||
|
||
- [(2.1)](#alg.transform-2.1)
|
||
|
||
[first1, first1 + N],
|
||
|
||
- [(2.2)](#alg.transform-2.2)
|
||
|
||
[first2, first2 + N], and
|
||
|
||
- [(2.3)](#alg.transform-2.3)
|
||
|
||
[result, result + N][.](#alg.transform-2.sentence-2)[203](#footnote-203 "The use of fully closed ranges is intentional.")
|
||
|
||
[3](#alg.transform-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7094)
|
||
|
||
*Effects*: Assigns through every iterator i in the range [result, result + N)
|
||
a new corresponding value equal to E(i)[.](#alg.transform-3.sentence-1)
|
||
|
||
[4](#alg.transform-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7100)
|
||
|
||
*Returns*:
|
||
|
||
- [(4.1)](#alg.transform-4.1)
|
||
|
||
result + N for the overloads defined in namespace std[.](#alg.transform-4.1.sentence-1)
|
||
|
||
- [(4.2)](#alg.transform-4.2)
|
||
|
||
{first1 + N, result + N} for unary transforms defined in namespace ranges[.](#alg.transform-4.2.sentence-1)
|
||
|
||
- [(4.3)](#alg.transform-4.3)
|
||
|
||
{first1 + N, first2 + N, result + N} for binary transforms defined in namespace ranges[.](#alg.transform-4.3.sentence-1)
|
||
|
||
[5](#alg.transform-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7114)
|
||
|
||
*Complexity*: Exactly N applications of op or binary_op, and
|
||
any projections[.](#alg.transform-5.sentence-1)
|
||
|
||
This requirement also applies to the parallel algorithm overloads[.](#alg.transform-5.sentence-2)
|
||
|
||
[6](#alg.transform-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7120)
|
||
|
||
*Remarks*: result may be equal to first1 or first2[.](#alg.transform-6.sentence-1)
|
||
|
||
[203)](#footnote-203)[203)](#footnoteref-203)
|
||
|
||
The use of fully closed ranges is intentional[.](#footnote-203.sentence-1)
|
||
|
||
### [26.7.5](#alg.replace) Replace [[alg.replace]](alg.replace)
|
||
|
||
[ð](#lib:replace)
|
||
|
||
`template<class ForwardIterator, class T = iterator_traits<ForwardIterator>::value_type>
|
||
constexpr void replace(ForwardIterator first, ForwardIterator last,
|
||
const T& old_value, const T& new_value);
|
||
template<class ExecutionPolicy, class ForwardIterator,
|
||
class T = iterator_traits<ForwardIterator>::value_type>
|
||
void replace(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last,
|
||
const T& old_value, const T& new_value);
|
||
|
||
template<class ForwardIterator, class Predicate,
|
||
class T = iterator_traits<ForwardIterator>::value_type>
|
||
constexpr void replace_if(ForwardIterator first, ForwardIterator last,
|
||
Predicate pred, const T& new_value);
|
||
template<class ExecutionPolicy, class ForwardIterator, class Predicate,
|
||
class T = iterator_traits<ForwardIterator>::value_type>
|
||
void replace_if(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last,
|
||
Predicate pred, const T& new_value);
|
||
|
||
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,
|
||
class T1 = projected_value_t<I, Proj>, class T2 = T1>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<I, const T2&> &&
|
||
[indirect_binary_predicate](indirectcallable.indirectinvocable#concept:indirect_binary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<ranges::equal_to, projected<I, Proj>, const T1*>
|
||
constexpr I
|
||
ranges::replace(I first, S last, const T1& old_value, const T2& new_value, Proj proj = {});
|
||
template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
class T1 = projected_value_t<iterator_t<R>, Proj>, class T2 = T1>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<iterator_t<R>, const T2&> &&
|
||
[indirect_binary_predicate](indirectcallable.indirectinvocable#concept:indirect_binary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<ranges::equal_to, projected<iterator_t<R>, Proj>, const T1*>
|
||
constexpr borrowed_iterator_t<R>
|
||
ranges::replace(R&& r, const T1& old_value, const T2& new_value, 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, class T1 = projected_value_t<I, Proj>, class T2 = T1>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<I, const T2&> &&
|
||
[indirect_binary_predicate](indirectcallable.indirectinvocable#concept:indirect_binary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<ranges::equal_to, projected<I, Proj>, const T1*>
|
||
I ranges::replace(Ep&& exec, I first, S last,
|
||
const T1& old_value, const T2& new_value, 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,
|
||
class T1 = projected_value_t<iterator_t<R>, Proj>, class T2 = T1>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<iterator_t<R>, const T2&> &&
|
||
[indirect_binary_predicate](indirectcallable.indirectinvocable#concept:indirect_binary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<ranges::equal_to,
|
||
projected<iterator_t<R>, Proj>, const T1*>
|
||
borrowed_iterator_t<R>
|
||
ranges::replace(Ep&& exec, R&& r, const T1& old_value, const T2& new_value,
|
||
Proj proj = {});
|
||
|
||
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,
|
||
class T = projected_value_t<I, Proj>,
|
||
[indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Pred>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<I, const T&>
|
||
constexpr I ranges::replace_if(I first, S last, Pred pred, const T& new_value, Proj proj = {});
|
||
template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity, class T = projected_value_t<iterator_t<R>, Proj>,
|
||
[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_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<iterator_t<R>, const T&>
|
||
constexpr borrowed_iterator_t<R>
|
||
ranges::replace_if(R&& r, Pred pred, const T& new_value, 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, class T = projected_value_t<I, Proj>,
|
||
[indirect_unary_predicate](indirectcallable.indirectinvocable#concept:indirect_unary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Pred>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<I, const T&>
|
||
I ranges::replace_if(Ep&& exec, I first, S last, Pred pred,
|
||
const T& new_value, 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,
|
||
class T = projected_value_t<iterator_t<R>, Proj>,
|
||
[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_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<iterator_t<R>, const T&>
|
||
borrowed_iterator_t<R>
|
||
ranges::replace_if(Ep&& exec, R&& r, Pred pred, const T& new_value, Proj proj = {});
|
||
`
|
||
|
||
[1](#alg.replace-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7203)
|
||
|
||
Let E(i) be
|
||
|
||
- [(1.1)](#alg.replace-1.1)
|
||
|
||
bool(*i == old_value) for replace;
|
||
|
||
- [(1.2)](#alg.replace-1.2)
|
||
|
||
bool(pred(*i)) for replace_if;
|
||
|
||
- [(1.3)](#alg.replace-1.3)
|
||
|
||
bool(invoke(proj, *i) == old_value) for ranges::replace;
|
||
|
||
- [(1.4)](#alg.replace-1.4)
|
||
|
||
bool(invoke(pred, invoke(proj, *i))) for ranges::replace_if[.](#alg.replace-1.sentence-1)
|
||
|
||
[2](#alg.replace-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7212)
|
||
|
||
*Mandates*: new_value is writable ([[iterator.requirements.general]](iterator.requirements.general "24.3.1 General")) to first[.](#alg.replace-2.sentence-1)
|
||
|
||
[3](#alg.replace-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7216)
|
||
|
||
*Effects*: Substitutes elements referred by the iterator i in the range [first, last) with new_value,
|
||
when E(i) is true[.](#alg.replace-3.sentence-1)
|
||
|
||
[4](#alg.replace-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7222)
|
||
|
||
*Returns*: last for the overloads in namespace ranges[.](#alg.replace-4.sentence-1)
|
||
|
||
[5](#alg.replace-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7226)
|
||
|
||
*Complexity*: Exactly last - first applications
|
||
of the corresponding predicate and any projection[.](#alg.replace-5.sentence-1)
|
||
|
||
[ð](#lib:replace_copy)
|
||
|
||
`template<class InputIterator, class OutputIterator, class T>
|
||
constexpr OutputIterator
|
||
replace_copy(InputIterator first, InputIterator last,
|
||
OutputIterator result,
|
||
const T& old_value, const T& new_value);
|
||
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class T>
|
||
ForwardIterator2
|
||
replace_copy(ExecutionPolicy&& exec,
|
||
ForwardIterator1 first, ForwardIterator1 last,
|
||
ForwardIterator2 result,
|
||
const T& old_value, const T& new_value);
|
||
|
||
template<class InputIterator, class OutputIterator, class Predicate, class T>
|
||
constexpr OutputIterator
|
||
replace_copy_if(InputIterator first, InputIterator last,
|
||
OutputIterator result,
|
||
Predicate pred, const T& new_value);
|
||
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
|
||
class Predicate, class T>
|
||
ForwardIterator2
|
||
replace_copy_if(ExecutionPolicy&& exec,
|
||
ForwardIterator1 first, ForwardIterator1 last,
|
||
ForwardIterator2 result,
|
||
Predicate pred, const T& new_value);
|
||
|
||
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 O,
|
||
class Proj = identity, class T1 = projected_value_t<I, Proj>, class T2 = iter_value_t<O>>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O> &&
|
||
[indirect_binary_predicate](indirectcallable.indirectinvocable#concept:indirect_binary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<ranges::equal_to, projected<I, Proj>, const T1*> &&
|
||
[output_iterator](iterator.concept.output#concept:output_iterator "24.3.4.10 Concept output_iterator [iterator.concept.output]")<O, const T2&>
|
||
constexpr ranges::replace_copy_result<I, O>
|
||
ranges::replace_copy(I first, S last, O result, const T1& old_value, const T2& new_value,
|
||
Proj proj = {});
|
||
template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R, class O, class Proj = identity,
|
||
class T1 = projected_value_t<iterator_t<R>, Proj>, class T2 = iter_value_t<O>>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, O> &&
|
||
[indirect_binary_predicate](indirectcallable.indirectinvocable#concept:indirect_binary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<ranges::equal_to, projected<iterator_t<R>, Proj>, const T1*>
|
||
&& [output_iterator](iterator.concept.output#concept:output_iterator "24.3.4.10 Concept output_iterator [iterator.concept.output]")<O, const T2&>
|
||
constexpr ranges::replace_copy_result<borrowed_iterator_t<R>, O>
|
||
ranges::replace_copy(R&& r, O result, const T1& old_value, const T2& new_value,
|
||
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]") O, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O> OutS,
|
||
class Proj = identity,
|
||
class T1 = projected_value_t<I, Proj>, class T2 = iter_value_t<O>>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O> &&
|
||
[indirect_binary_predicate](indirectcallable.indirectinvocable#concept:indirect_binary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<ranges::equal_to, projected<I, Proj>, const T1*> &&
|
||
[indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<O, const T2&>
|
||
ranges::replace_copy_result<I, O>
|
||
ranges::replace_copy(Ep&& exec, I first, S last, O result, OutS result_last,
|
||
const T1& old_value, const T2& new_value, 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]") OutR,
|
||
class Proj = identity, class T1 = projected_value_t<iterator_t<R>, Proj>,
|
||
class T2 = range_value_t<OutR>>
|
||
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<OutR>> &&
|
||
[indirect_binary_predicate](indirectcallable.indirectinvocable#concept:indirect_binary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<ranges::equal_to,
|
||
projected<iterator_t<R>, Proj>, const T1*> &&
|
||
[indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<iterator_t<OutR>, const T2&>
|
||
ranges::replace_copy_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
|
||
ranges::replace_copy(Ep&& exec, R&& r, OutR&& result_r, const T1& old_value,
|
||
const T2& new_value, Proj proj = {});
|
||
|
||
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 O, class T = iter_value_t<O>,
|
||
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, O> && [output_iterator](iterator.concept.output#concept:output_iterator "24.3.4.10 Concept output_iterator [iterator.concept.output]")<O, const T&>
|
||
constexpr ranges::replace_copy_if_result<I, O>
|
||
ranges::replace_copy_if(I first, S last, O result, Pred pred, const T& new_value,
|
||
Proj proj = {});
|
||
template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R, class O, class T = iter_value_t<O>, 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>, O> && [output_iterator](iterator.concept.output#concept:output_iterator "24.3.4.10 Concept output_iterator [iterator.concept.output]")<O, const T&>
|
||
constexpr ranges::replace_copy_if_result<borrowed_iterator_t<R>, O>
|
||
ranges::replace_copy_if(R&& r, O result, Pred pred, const T& new_value,
|
||
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]") O, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O> OutS, class T = iter_value_t<O>,
|
||
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, O> && [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<O, const T&>
|
||
ranges::replace_copy_if_result<I, O>
|
||
ranges::replace_copy_if(Ep&& exec, I first, S last, O result, OutS result_last,
|
||
Pred pred, const T& new_value, 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]") OutR,
|
||
class T = range_value_t<OutR>, 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<OutR>> &&
|
||
[indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<OutR, const T&>
|
||
ranges::replace_copy_if_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
|
||
ranges::replace_copy_if(Ep&& exec, R&& r, OutR&& result_r, Pred pred, const T& new_value,
|
||
Proj proj = {});
|
||
`
|
||
|
||
[6](#alg.replace-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7330)
|
||
|
||
Let E(i) be
|
||
|
||
- [(6.1)](#alg.replace-6.1)
|
||
|
||
bool(*(first + (i - result)) == old_value) for replace_copy;
|
||
|
||
- [(6.2)](#alg.replace-6.2)
|
||
|
||
bool(pred(*(first + (i - result)))) for replace_copy_if;
|
||
|
||
- [(6.3)](#alg.replace-6.3)
|
||
|
||
bool(invoke(proj, *(first + (i - result))) == old_value) for ranges::replace_copy;
|
||
|
||
- [(6.4)](#alg.replace-6.4)
|
||
|
||
bool(invoke(pred, invoke(proj, *(first + (i - result))))) for ranges::replace_copy_if[.](#alg.replace-6.sentence-1)
|
||
|
||
[7](#alg.replace-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7343)
|
||
|
||
Let:
|
||
|
||
- [(7.1)](#alg.replace-7.1)
|
||
|
||
result_last be result + (last - first) for the overloads with no parameter result_last or result_r;
|
||
|
||
- [(7.2)](#alg.replace-7.2)
|
||
|
||
N be min(last - first, result_last - result)[.](#alg.replace-7.sentence-1)
|
||
|
||
[8](#alg.replace-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7353)
|
||
|
||
*Mandates*: The results of the expressions *first and new_value are writable ([[iterator.requirements.general]](iterator.requirements.general "24.3.1 General")) to result[.](#alg.replace-8.sentence-1)
|
||
|
||
[9](#alg.replace-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7358)
|
||
|
||
*Preconditions*: The ranges [first, last) and [result, result + N)
|
||
do not overlap[.](#alg.replace-9.sentence-1)
|
||
|
||
[10](#alg.replace-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7363)
|
||
|
||
*Effects*: Assigns through every iterator i in the range [result, result + N)
|
||
a new corresponding value
|
||
|
||
- [(10.1)](#alg.replace-10.1)
|
||
|
||
new_value if E(i) is true or
|
||
|
||
- [(10.2)](#alg.replace-10.2)
|
||
|
||
*(first + (i - result)) otherwise[.](#alg.replace-10.sentence-1)
|
||
|
||
[11](#alg.replace-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7373)
|
||
|
||
*Returns*:
|
||
|
||
- [(11.1)](#alg.replace-11.1)
|
||
|
||
result + N for the overloads in namespace std[.](#alg.replace-11.1.sentence-1)
|
||
|
||
- [(11.2)](#alg.replace-11.2)
|
||
|
||
{first + N, result + N} for the overloads in namespace ranges[.](#alg.replace-11.2.sentence-1)
|
||
|
||
[12](#alg.replace-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7384)
|
||
|
||
*Complexity*: Exactly N applications
|
||
of the corresponding predicate and any projection[.](#alg.replace-12.sentence-1)
|
||
|
||
### [26.7.6](#alg.fill) Fill [[alg.fill]](alg.fill)
|
||
|
||
[ð](#lib:fill)
|
||
|
||
`template<class ForwardIterator, class T = iterator_traits<ForwardIterator>::value_type>
|
||
constexpr void fill(ForwardIterator first, ForwardIterator last, const T& value);
|
||
template<class ExecutionPolicy, class ForwardIterator,
|
||
class T = iterator_traits<ForwardIterator>::value_type>
|
||
void fill(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last, const T& value);
|
||
|
||
template<class OutputIterator, class Size, class T = iterator_traits<OutputIterator>::value_type>
|
||
constexpr OutputIterator fill_n(OutputIterator first, Size n, const T& value);
|
||
template<class ExecutionPolicy, class ForwardIterator, class Size,
|
||
class T = iterator_traits<ForwardIterator>::value_type>
|
||
ForwardIterator fill_n(ExecutionPolicy&& exec,
|
||
ForwardIterator first, Size n, const T& value);
|
||
|
||
template<class O, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<O> S, class T = iter_value_t<O>>
|
||
requires [output_iterator](iterator.concept.output#concept:output_iterator "24.3.4.10 Concept output_iterator [iterator.concept.output]")<O, const T&>
|
||
constexpr O ranges::fill(O first, S last, const T& value);
|
||
template<class R, class T = range_value_t<R>>
|
||
requires [output_range](range.refinements#concept:output_range "25.4.6 Other range refinements [range.refinements]")<R, const T&>
|
||
constexpr borrowed_iterator_t<R> ranges::fill(R&& r, const T& value);
|
||
template<class O, class T = iter_value_t<O>>
|
||
requires [output_iterator](iterator.concept.output#concept:output_iterator "24.3.4.10 Concept output_iterator [iterator.concept.output]")<O, const T&>
|
||
constexpr O ranges::fill_n(O first, iter_difference_t<O> n, const T& value);
|
||
|
||
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]") O, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O> S,
|
||
class T = iter_value_t<O>>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<O, const T&>
|
||
O ranges::fill(Ep&& exec, O first, S last, const T& value);
|
||
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 T = range_value_t<R>>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<iterator_t<R>, const T&>
|
||
borrowed_iterator_t<R> fill(Ep&& exec, R&& r, const T& value);
|
||
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]") O, class T = iter_value_t<O>>
|
||
requires [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<O, const T&>
|
||
O ranges::fill_n(Ep&& exec, O first, iter_difference_t<O> n, const T& value);
|
||
`
|
||
|
||
[1](#alg.fill-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7432)
|
||
|
||
Let N be max(0, n) for the fill_n algorithms, andlast - first for the fill algorithms[.](#alg.fill-1.sentence-1)
|
||
|
||
[2](#alg.fill-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7436)
|
||
|
||
*Mandates*: The expression value is writable ([[iterator.requirements.general]](iterator.requirements.general "24.3.1 General")) to the output iterator[.](#alg.fill-2.sentence-1)
|
||
|
||
The type Size is convertible
|
||
to an integral type ([[conv.integral]](conv.integral "7.3.9 Integral conversions"), [[class.conv]](class.conv "11.4.8 Conversions"))[.](#alg.fill-2.sentence-2)
|
||
|
||
[3](#alg.fill-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7443)
|
||
|
||
*Effects*: Assigns value through all the iterators in the range [first, first + N)[.](#alg.fill-3.sentence-1)
|
||
|
||
[4](#alg.fill-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7448)
|
||
|
||
*Returns*: first + N[.](#alg.fill-4.sentence-1)
|
||
|
||
[5](#alg.fill-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7452)
|
||
|
||
*Complexity*: Exactly N assignments[.](#alg.fill-5.sentence-1)
|
||
|
||
### [26.7.7](#alg.generate) Generate [[alg.generate]](alg.generate)
|
||
|
||
[ð](#lib:generate)
|
||
|
||
`template<class ForwardIterator, class Generator>
|
||
constexpr void generate(ForwardIterator first, ForwardIterator last,
|
||
Generator gen);
|
||
template<class ExecutionPolicy, class ForwardIterator, class Generator>
|
||
void generate(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last,
|
||
Generator gen);
|
||
|
||
template<class OutputIterator, class Size, class Generator>
|
||
constexpr OutputIterator generate_n(OutputIterator first, Size n, Generator gen);
|
||
template<class ExecutionPolicy, class ForwardIterator, class Size, class Generator>
|
||
ForwardIterator generate_n(ExecutionPolicy&& exec,
|
||
ForwardIterator first, Size n, Generator gen);
|
||
|
||
template<[input_or_output_iterator](iterator.concept.iterator#concept:input_or_output_iterator "24.3.4.6 Concept input_or_output_iterator [iterator.concept.iterator]") O, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<O> S, [copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_constructible [concept.copyconstructible]") F>
|
||
requires [invocable](concept.invocable#concept:invocable "18.7.2 Concept invocable [concept.invocable]")<F&> && [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<O, invoke_result_t<F&>>
|
||
constexpr O ranges::generate(O first, S last, F gen);
|
||
template<class R, [copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_constructible [concept.copyconstructible]") F>
|
||
requires [invocable](concept.invocable#concept:invocable "18.7.2 Concept invocable [concept.invocable]")<F&> && [output_range](range.refinements#concept:output_range "25.4.6 Other range refinements [range.refinements]")<R, invoke_result_t<F&>>
|
||
constexpr borrowed_iterator_t<R> ranges::generate(R&& r, F gen);
|
||
template<[input_or_output_iterator](iterator.concept.iterator#concept:input_or_output_iterator "24.3.4.6 Concept input_or_output_iterator [iterator.concept.iterator]") O, [copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_constructible [concept.copyconstructible]") F>
|
||
requires [invocable](concept.invocable#concept:invocable "18.7.2 Concept invocable [concept.invocable]")<F&> && [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<O, invoke_result_t<F&>>
|
||
constexpr O ranges::generate_n(O first, iter_difference_t<O> n, F gen);
|
||
|
||
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]") O, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O> S,
|
||
[copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_constructible [concept.copyconstructible]") F>
|
||
requires [invocable](concept.invocable#concept:invocable "18.7.2 Concept invocable [concept.invocable]")<F&> && [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<O, invoke_result_t<F&>>
|
||
O ranges::generate(Ep&& exec, O first, S last, F gen);
|
||
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, [copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_constructible [concept.copyconstructible]") F>
|
||
requires [invocable](concept.invocable#concept:invocable "18.7.2 Concept invocable [concept.invocable]")<F&> && [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<iterator_t<R>, invoke_result_t<F&>>
|
||
borrowed_iterator_t<R> ranges::generate(Ep&& exec, R&& r, F gen);
|
||
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]") O, [copy_constructible](concept.copyconstructible#concept:copy_constructible "18.4.14 Concept copy_constructible [concept.copyconstructible]") F>
|
||
requires [invocable](concept.invocable#concept:invocable "18.7.2 Concept invocable [concept.invocable]")<F&> && [indirectly_writable](iterator.concept.writable#concept:indirectly_writable "24.3.4.3 Concept indirectly_writable [iterator.concept.writable]")<O, invoke_result_t<F&>>
|
||
O ranges::generate_n(Ep&& exec, O first, iter_difference_t<O> n, F gen);
|
||
`
|
||
|
||
[1](#alg.generate-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7499)
|
||
|
||
Let N be max(0, n) for the generate_n algorithms, andlast - first for the generate algorithms[.](#alg.generate-1.sentence-1)
|
||
|
||
[2](#alg.generate-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7503)
|
||
|
||
*Mandates*: Size is convertible
|
||
to an integral type ([[conv.integral]](conv.integral "7.3.9 Integral conversions"), [[class.conv]](class.conv "11.4.8 Conversions"))[.](#alg.generate-2.sentence-1)
|
||
|
||
[3](#alg.generate-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7508)
|
||
|
||
*Effects*: Assigns the result of successive evaluations of gen() through each iterator in the range [first, first + N)[.](#alg.generate-3.sentence-1)
|
||
|
||
[4](#alg.generate-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7513)
|
||
|
||
*Returns*: first + N[.](#alg.generate-4.sentence-1)
|
||
|
||
[5](#alg.generate-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7517)
|
||
|
||
*Complexity*: Exactly N evaluations of gen() and assignments[.](#alg.generate-5.sentence-1)
|
||
|
||
[6](#alg.generate-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7521)
|
||
|
||
*Remarks*: gen may modify objects via its arguments
|
||
for parallel algorithm overloads ([[algorithms.parallel.user]](algorithms.parallel.user "26.3.2 Requirements on user-provided function objects"))[.](#alg.generate-6.sentence-1)
|
||
|
||
### [26.7.8](#alg.remove) Remove [[alg.remove]](alg.remove)
|
||
|
||
[ð](#lib:remove)
|
||
|
||
`template<class ForwardIterator, class T = iterator_traits<ForwardIterator>::value_type>
|
||
constexpr ForwardIterator remove(ForwardIterator first, ForwardIterator last,
|
||
const T& value);
|
||
template<class ExecutionPolicy, class ForwardIterator,
|
||
class T = iterator_traits<ForwardIterator>::value_type>
|
||
ForwardIterator remove(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last,
|
||
const T& value);
|
||
|
||
template<class ForwardIterator, class Predicate>
|
||
constexpr ForwardIterator remove_if(ForwardIterator first, ForwardIterator last,
|
||
Predicate pred);
|
||
template<class ExecutionPolicy, class ForwardIterator, class Predicate>
|
||
ForwardIterator remove_if(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,
|
||
class T = projected_value_t<I, Proj>>
|
||
requires [indirect_binary_predicate](indirectcallable.indirectinvocable#concept:indirect_binary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<ranges::equal_to, projected<I, Proj>, const T*>
|
||
constexpr subrange<I> ranges::remove(I first, S last, const T& value, Proj proj = {});
|
||
template<[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
class T = projected_value_t<iterator_t<R>, Proj>>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<iterator_t<R>> &&
|
||
[indirect_binary_predicate](indirectcallable.indirectinvocable#concept:indirect_binary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*>
|
||
constexpr borrowed_subrange_t<R>
|
||
ranges::remove(R&& r, const T& value, 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, class T = projected_value_t<I, Proj>>
|
||
requires [indirect_binary_predicate](indirectcallable.indirectinvocable#concept:indirect_binary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<ranges::equal_to, projected<I, Proj>, const T*>
|
||
subrange<I>
|
||
ranges::remove(Ep&& exec, I first, S last, const T& value, 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,
|
||
class T = projected_value_t<iterator_t<R>, Proj>>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<iterator_t<R>> &&
|
||
[indirect_binary_predicate](indirectcallable.indirectinvocable#concept:indirect_binary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<ranges::equal_to,
|
||
projected<iterator_t<R>, Proj>, const T*>
|
||
borrowed_subrange_t<R>
|
||
ranges::remove(Ep&& exec, R&& r, const T& value, Proj proj = {});
|
||
|
||
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::remove_if(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::remove_if(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::remove_if(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::remove_if(Ep&& exec, R&& r, Pred pred, Proj proj = {});
|
||
`
|
||
|
||
[1](#alg.remove-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7594)
|
||
|
||
Let E be
|
||
|
||
- [(1.1)](#alg.remove-1.1)
|
||
|
||
bool(*i == value) for remove;
|
||
|
||
- [(1.2)](#alg.remove-1.2)
|
||
|
||
bool(pred(*i)) for remove_if;
|
||
|
||
- [(1.3)](#alg.remove-1.3)
|
||
|
||
bool(invoke(proj, *i) == value) for ranges::remove;
|
||
|
||
- [(1.4)](#alg.remove-1.4)
|
||
|
||
bool(invoke(pred, invoke(proj, *i))) for ranges::remove_if[.](#alg.remove-1.sentence-1)
|
||
|
||
[2](#alg.remove-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7603)
|
||
|
||
*Preconditions*: For the algorithms in namespace std,
|
||
the type of *first meets the [*Cpp17MoveAssignable*](utility.arg.requirements#:Cpp17MoveAssignable "16.4.4.2 Template argument requirements [utility.arg.requirements]") requirements (Table [33](utility.arg.requirements#tab:cpp17.moveassignable "Table 33: Cpp17MoveAssignable requirements"))[.](#alg.remove-2.sentence-1)
|
||
|
||
[3](#alg.remove-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7609)
|
||
|
||
*Effects*: Eliminates all the elements referred to by iterator i in the range [first, last) for which E holds[.](#alg.remove-3.sentence-1)
|
||
|
||
[4](#alg.remove-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7614)
|
||
|
||
*Returns*: Let j be the end of the resulting range[.](#alg.remove-4.sentence-1)
|
||
|
||
Returns:
|
||
|
||
- [(4.1)](#alg.remove-4.1)
|
||
|
||
j for the overloads in namespace std[.](#alg.remove-4.1.sentence-1)
|
||
|
||
- [(4.2)](#alg.remove-4.2)
|
||
|
||
{j, last} for the overloads in namespace ranges[.](#alg.remove-4.2.sentence-1)
|
||
|
||
[5](#alg.remove-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7622)
|
||
|
||
*Complexity*: Exactly last - first applications
|
||
of the corresponding predicate and any projection[.](#alg.remove-5.sentence-1)
|
||
|
||
[6](#alg.remove-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7627)
|
||
|
||
*Remarks*: Stable ([[algorithm.stable]](algorithm.stable "16.4.6.8 Requirements for stable algorithms"))[.](#alg.remove-6.sentence-1)
|
||
|
||
[7](#alg.remove-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7631)
|
||
|
||
[*Note [1](#alg.remove-note-1)*:
|
||
|
||
Each element in the range [ret, last),
|
||
where ret is the returned value,
|
||
has a valid but unspecified state,
|
||
because the algorithms can eliminate elements
|
||
by moving from elements that were originally in that range[.](#alg.remove-7.sentence-1)
|
||
|
||
â *end note*]
|
||
|
||
[ð](#lib:remove_copy)
|
||
|
||
`template<class InputIterator, class OutputIterator,
|
||
class T = iterator_traits<InputIterator>::value_type>
|
||
constexpr OutputIterator
|
||
remove_copy(InputIterator first, InputIterator last,
|
||
OutputIterator result, const T& value);
|
||
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
|
||
class T = iterator_traits<ForwardIterator1>::value_type>
|
||
ForwardIterator2
|
||
remove_copy(ExecutionPolicy&& exec,
|
||
ForwardIterator1 first, ForwardIterator1 last,
|
||
ForwardIterator2 result, const T& value);
|
||
|
||
template<class InputIterator, class OutputIterator, class Predicate>
|
||
constexpr OutputIterator
|
||
remove_copy_if(InputIterator first, InputIterator last,
|
||
OutputIterator result, Predicate pred);
|
||
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
|
||
class Predicate>
|
||
ForwardIterator2
|
||
remove_copy_if(ExecutionPolicy&& exec,
|
||
ForwardIterator1 first, ForwardIterator1 last,
|
||
ForwardIterator2 result, 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]") O,
|
||
class Proj = identity, class T = projected_value_t<I, Proj>>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O> &&
|
||
[indirect_binary_predicate](indirectcallable.indirectinvocable#concept:indirect_binary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<ranges::equal_to, projected<I, Proj>, const T*>
|
||
constexpr ranges::remove_copy_result<I, O>
|
||
ranges::remove_copy(I first, S last, O result, const T& value, 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]") O, class Proj = identity,
|
||
class T = projected_value_t<iterator_t<R>, Proj>>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, O> &&
|
||
[indirect_binary_predicate](indirectcallable.indirectinvocable#concept:indirect_binary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*>
|
||
constexpr ranges::remove_copy_result<borrowed_iterator_t<R>, O>
|
||
ranges::remove_copy(R&& r, O result, const T& value, 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]") O, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O> OutS,
|
||
class Proj = identity, class T = projected_value_t<I, Proj>>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O> &&
|
||
[indirect_binary_predicate](indirectcallable.indirectinvocable#concept:indirect_binary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<ranges::equal_to, projected<I, Proj>, const T*>
|
||
ranges::remove_copy_result<I, O>
|
||
ranges::remove_copy(Ep&& exec, I first, S last, O result, OutS result_last,
|
||
const T& value, 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]") OutR,
|
||
class Proj = identity, class T = projected_value_t<iterator_t<R>, Proj>>
|
||
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<OutR>> &&
|
||
[indirect_binary_predicate](indirectcallable.indirectinvocable#concept:indirect_binary_predicate "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<ranges::equal_to,
|
||
projected<iterator_t<R>, Proj>, const T*>
|
||
ranges::remove_copy_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
|
||
ranges::remove_copy(Ep&& exec, R&& r, OutR&& result_r, const T& value, Proj proj = {});
|
||
|
||
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]") O,
|
||
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, O>
|
||
constexpr ranges::remove_copy_if_result<I, O>
|
||
ranges::remove_copy_if(I first, S last, O result, 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]") O, 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>, O>
|
||
constexpr ranges::remove_copy_if_result<borrowed_iterator_t<R>, O>
|
||
ranges::remove_copy_if(R&& r, O result, 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]") O, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O> OutS,
|
||
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, O>
|
||
ranges::remove_copy_if_result<I, O>
|
||
ranges::remove_copy_if(Ep&& exec, I first, S last, O result, OutS result_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, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") OutR,
|
||
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<OutR>>
|
||
ranges::remove_copy_if_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
|
||
ranges::remove_copy_if(Ep&& exec, R&& r, OutR&& result_r, Pred pred, Proj proj = {});
|
||
`
|
||
|
||
[8](#alg.remove-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7723)
|
||
|
||
Let E(i) be
|
||
|
||
- [(8.1)](#alg.remove-8.1)
|
||
|
||
bool(*i == value) for remove_copy;
|
||
|
||
- [(8.2)](#alg.remove-8.2)
|
||
|
||
bool(pred(*i)) for remove_copy_if;
|
||
|
||
- [(8.3)](#alg.remove-8.3)
|
||
|
||
bool(invoke(proj, *i) == value) for ranges::remove_copy;
|
||
|
||
- [(8.4)](#alg.remove-8.4)
|
||
|
||
bool(invoke(pred, invoke(proj, *i))) for ranges::remove_copy_if[.](#alg.remove-8.sentence-1)
|
||
|
||
[9](#alg.remove-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7732)
|
||
|
||
Let:
|
||
|
||
- [(9.1)](#alg.remove-9.1)
|
||
|
||
M be the number of iterators i in [first, last)
|
||
for which E(i) is false;
|
||
|
||
- [(9.2)](#alg.remove-9.2)
|
||
|
||
result_last be result + M for the overloads with no parameter result_last or result_r;
|
||
|
||
- [(9.3)](#alg.remove-9.3)
|
||
|
||
N be min(M, result_last - result)[.](#alg.remove-9.sentence-1)
|
||
|
||
[10](#alg.remove-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7745)
|
||
|
||
*Mandates*: *first is writable ([[iterator.requirements.general]](iterator.requirements.general "24.3.1 General")) to result[.](#alg.remove-10.sentence-1)
|
||
|
||
[11](#alg.remove-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7749)
|
||
|
||
*Preconditions*: The ranges [first, last) and [result, result + N)
|
||
do not overlap[.](#alg.remove-11.sentence-1)
|
||
|
||
[*Note [2](#alg.remove-note-2)*:
|
||
|
||
For the parallel algorithm overloads in namespace std,
|
||
there can be a performance cost
|
||
if iterator_traits<ForwardIterator1>::value_type does not meet
|
||
the *Cpp17MoveConstructible* (Table [31](utility.arg.requirements#tab:cpp17.moveconstructible "Table 31: Cpp17MoveConstructible requirements")) requirements[.](#alg.remove-11.sentence-2)
|
||
|
||
For the parallel algorithm overloads in namespace ranges,
|
||
there can be a performance cost
|
||
if iter_value_t<I> does not model [move_constructible](concept.moveconstructible#concept:move_constructible "18.4.13 Concept move_constructible [concept.moveconstructible]")[.](#alg.remove-11.sentence-3)
|
||
|
||
â *end note*]
|
||
|
||
[12](#alg.remove-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7763)
|
||
|
||
*Effects*: Copies the first N elements referred to by the iterator i in the range [first, last) for which E(i) is false into the range [result, result + N)[.](#alg.remove-12.sentence-1)
|
||
|
||
[13](#alg.remove-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7769)
|
||
|
||
*Returns*:
|
||
|
||
- [(13.1)](#alg.remove-13.1)
|
||
|
||
result + N,
|
||
for the algorithms in namespace std[.](#alg.remove-13.1.sentence-1)
|
||
|
||
- [(13.2)](#alg.remove-13.2)
|
||
|
||
{last, result + N},
|
||
for the algorithms in namespace ranges,
|
||
if N is equal to M[.](#alg.remove-13.2.sentence-1)
|
||
|
||
- [(13.3)](#alg.remove-13.3)
|
||
|
||
Otherwise, {j, result_last},
|
||
for the algorithms in namespace ranges,
|
||
where j is the iterator in [first, last)
|
||
for which E(j) is false and there are exactly N iterators i in [first, j)
|
||
for which E(i) is false[.](#alg.remove-13.3.sentence-1)
|
||
|
||
[14](#alg.remove-14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7788)
|
||
|
||
*Complexity*: At most last - first applications
|
||
of the corresponding predicate and any projection[.](#alg.remove-14.sentence-1)
|
||
|
||
[15](#alg.remove-15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7793)
|
||
|
||
*Remarks*: Stable ([[algorithm.stable]](algorithm.stable "16.4.6.8 Requirements for stable algorithms"))[.](#alg.remove-15.sentence-1)
|
||
|
||
### [26.7.9](#alg.unique) Unique [[alg.unique]](alg.unique)
|
||
|
||
[ð](#lib:unique)
|
||
|
||
`template<class ForwardIterator>
|
||
constexpr ForwardIterator unique(ForwardIterator first, ForwardIterator last);
|
||
template<class ExecutionPolicy, class ForwardIterator>
|
||
ForwardIterator unique(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last);
|
||
|
||
template<class ForwardIterator, class BinaryPredicate>
|
||
constexpr ForwardIterator unique(ForwardIterator first, ForwardIterator last,
|
||
BinaryPredicate pred);
|
||
template<class ExecutionPolicy, class ForwardIterator, class BinaryPredicate>
|
||
ForwardIterator unique(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last,
|
||
BinaryPredicate 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_equivalence_relation](indirectcallable.indirectinvocable#concept:indirect_equivalence_relation "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> C = ranges::equal_to>
|
||
constexpr subrange<I> ranges::unique(I first, S last, C comp = {}, Proj proj = {});
|
||
template<[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_equivalence_relation](indirectcallable.indirectinvocable#concept:indirect_equivalence_relation "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> C = ranges::equal_to>
|
||
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::unique(R&& r, C 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_equivalence_relation](indirectcallable.indirectinvocable#concept:indirect_equivalence_relation "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> C = ranges::equal_to>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<I>
|
||
subrange<I> ranges::unique(Ep&& exec, I first, S last, C 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_equivalence_relation](indirectcallable.indirectinvocable#concept:indirect_equivalence_relation "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> C = ranges::equal_to>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<iterator_t<R>>
|
||
borrowed_subrange_t<R> ranges::unique(Ep&& exec, R&& r, C comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[1](#alg.unique-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7837)
|
||
|
||
Let pred be equal_to{} for the overloads with no parameter pred, and
|
||
let E be
|
||
|
||
- [(1.1)](#alg.unique-1.1)
|
||
|
||
bool(pred(*(i - 1), *i)) for the overloads in namespace std;
|
||
|
||
- [(1.2)](#alg.unique-1.2)
|
||
|
||
bool(invoke(comp, invoke(proj, *(i - 1)), invoke(proj, *i))) for the overloads in namespace ranges[.](#alg.unique-1.sentence-1)
|
||
|
||
[2](#alg.unique-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7851)
|
||
|
||
*Preconditions*: For the overloads in namespace std,pred is an equivalence relation and
|
||
the type of *first meets
|
||
the [*Cpp17MoveAssignable*](utility.arg.requirements#:Cpp17MoveAssignable "16.4.4.2 Template argument requirements [utility.arg.requirements]") requirements (Table [33](utility.arg.requirements#tab:cpp17.moveassignable "Table 33: Cpp17MoveAssignable requirements"))[.](#alg.unique-2.sentence-1)
|
||
|
||
[3](#alg.unique-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7858)
|
||
|
||
*Effects*: For a nonempty range, eliminates all but the first element
|
||
from every consecutive group of equivalent elements referred to
|
||
by the iterator i in the range [first + 1, last)
|
||
for which E is true[.](#alg.unique-3.sentence-1)
|
||
|
||
[4](#alg.unique-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7865)
|
||
|
||
*Returns*: Let j be the end of the resulting range[.](#alg.unique-4.sentence-1)
|
||
|
||
Returns:
|
||
|
||
- [(4.1)](#alg.unique-4.1)
|
||
|
||
j for the overloads in namespace std[.](#alg.unique-4.1.sentence-1)
|
||
|
||
- [(4.2)](#alg.unique-4.2)
|
||
|
||
{j, last} for the overloads in namespace ranges[.](#alg.unique-4.2.sentence-1)
|
||
|
||
[5](#alg.unique-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7873)
|
||
|
||
*Complexity*: For nonempty ranges, exactly (last - first) - 1 applications
|
||
of the corresponding predicate and
|
||
no more than twice as many applications of any projection[.](#alg.unique-5.sentence-1)
|
||
|
||
[ð](#lib:unique_copy)
|
||
|
||
`template<class InputIterator, class OutputIterator>
|
||
constexpr OutputIterator
|
||
unique_copy(InputIterator first, InputIterator last,
|
||
OutputIterator result);
|
||
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
|
||
ForwardIterator2
|
||
unique_copy(ExecutionPolicy&& exec,
|
||
ForwardIterator1 first, ForwardIterator1 last,
|
||
ForwardIterator2 result);
|
||
|
||
template<class InputIterator, class OutputIterator,
|
||
class BinaryPredicate>
|
||
constexpr OutputIterator
|
||
unique_copy(InputIterator first, InputIterator last,
|
||
OutputIterator result, BinaryPredicate pred);
|
||
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
|
||
class BinaryPredicate>
|
||
ForwardIterator2
|
||
unique_copy(ExecutionPolicy&& exec,
|
||
ForwardIterator1 first, ForwardIterator1 last,
|
||
ForwardIterator2 result, BinaryPredicate 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]") O, class Proj = identity,
|
||
[indirect_equivalence_relation](indirectcallable.indirectinvocable#concept:indirect_equivalence_relation "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> C = ranges::equal_to>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O> &&
|
||
([forward_iterator](iterator.concept.forward#concept:forward_iterator "24.3.4.11 Concept forward_iterator [iterator.concept.forward]")<I> ||
|
||
([input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_iterator [iterator.concept.input]")<O> && [same_as](concept.same#concept:same_as "18.4.2 Concept same_as [concept.same]")<iter_value_t<I>, iter_value_t<O>>) ||
|
||
[indirectly_copyable_storable](alg.req.ind.copy#concept:indirectly_copyable_storable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O>)
|
||
constexpr ranges::unique_copy_result<I, O>
|
||
ranges::unique_copy(I first, S last, O result, C comp = {}, 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]") O, class Proj = identity,
|
||
[indirect_equivalence_relation](indirectcallable.indirectinvocable#concept:indirect_equivalence_relation "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> C = ranges::equal_to>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, O> &&
|
||
([forward_iterator](iterator.concept.forward#concept:forward_iterator "24.3.4.11 Concept forward_iterator [iterator.concept.forward]")<iterator_t<R>> ||
|
||
([input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9 Concept input_iterator [iterator.concept.input]")<O> && [same_as](concept.same#concept:same_as "18.4.2 Concept same_as [concept.same]")<range_value_t<R>, iter_value_t<O>>) ||
|
||
[indirectly_copyable_storable](alg.req.ind.copy#concept:indirectly_copyable_storable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, O>)
|
||
constexpr ranges::unique_copy_result<borrowed_iterator_t<R>, O>
|
||
ranges::unique_copy(R&& r, O result, C 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,
|
||
[random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") O, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O> OutS, class Proj = identity,
|
||
[indirect_equivalence_relation](indirectcallable.indirectinvocable#concept:indirect_equivalence_relation "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> C = ranges::equal_to>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O>
|
||
ranges::unique_copy_result<I, O>
|
||
ranges::unique_copy(Ep&& exec, I first, S last, O result, OutS result_last,
|
||
C 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, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") OutR,
|
||
class Proj = identity,
|
||
[indirect_equivalence_relation](indirectcallable.indirectinvocable#concept:indirect_equivalence_relation "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> C = ranges::equal_to>
|
||
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<OutR>>
|
||
ranges::unique_copy_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
|
||
ranges::unique_copy(Ep&& exec, R&& r, OutR&& result_r, C comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[6](#alg.unique-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7937)
|
||
|
||
Let pred be equal_to{} for the overloads
|
||
in namespace std with no parameter pred, and
|
||
let E(i) be
|
||
|
||
- [(6.1)](#alg.unique-6.1)
|
||
|
||
bool(pred(*i, *(i - 1))) for the overloads in namespace std;
|
||
|
||
- [(6.2)](#alg.unique-6.2)
|
||
|
||
bool(invoke(comp, invoke(proj, *i), invoke(proj, *(i - 1)))) for the overloads in namespace ranges[.](#alg.unique-6.sentence-1)
|
||
|
||
[7](#alg.unique-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7951)
|
||
|
||
Let:
|
||
|
||
- [(7.1)](#alg.unique-7.1)
|
||
|
||
M be the number of iterators i in the range [first + 1, last)
|
||
for which E(i) is false;
|
||
|
||
- [(7.2)](#alg.unique-7.2)
|
||
|
||
result_last be result + M + 1 for the overloads with no parameter result_last or result_r;
|
||
|
||
- [(7.3)](#alg.unique-7.3)
|
||
|
||
N be min(M+1, result_last - result)[.](#alg.unique-7.sentence-1)
|
||
|
||
[8](#alg.unique-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7964)
|
||
|
||
*Mandates*: *first is writable ([[iterator.requirements.general]](iterator.requirements.general "24.3.1 General")) to result[.](#alg.unique-8.sentence-1)
|
||
|
||
[9](#alg.unique-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L7968)
|
||
|
||
*Preconditions*:
|
||
|
||
- [(9.1)](#alg.unique-9.1)
|
||
|
||
The ranges [first, last) and [result, result + N)
|
||
do not overlap[.](#alg.unique-9.1.sentence-1)
|
||
|
||
- [(9.2)](#alg.unique-9.2)
|
||
|
||
For the overloads in namespace std:
|
||
* [(9.2.1)](#alg.unique-9.2.1)
|
||
|
||
The comparison function is an equivalence relation[.](#alg.unique-9.2.1.sentence-1)
|
||
|
||
* [(9.2.2)](#alg.unique-9.2.2)
|
||
|
||
For the overloads with no ExecutionPolicy,
|
||
let T be the value type of InputIterator[.](#alg.unique-9.2.2.sentence-1)
|
||
If InputIterator models [forward_iterator](iterator.concept.forward#concept:forward_iterator "24.3.4.11 Concept forward_iterator [iterator.concept.forward]") ([[iterator.concept.forward]](iterator.concept.forward "24.3.4.11 Concept forward_iterator")),
|
||
then there are no additional requirements for T[.](#alg.unique-9.2.2.sentence-2)
|
||
Otherwise, if OutputIterator meets
|
||
the [*Cpp17ForwardIterator*](forward.iterators#:Cpp17ForwardIterator "24.3.5.5 Forward iterators [forward.iterators]") requirements and
|
||
its value type is the same as T,
|
||
then T meets
|
||
the [*Cpp17CopyAssignable*](utility.arg.requirements#:Cpp17CopyAssignable "16.4.4.2 Template argument requirements [utility.arg.requirements]") (Table [34](utility.arg.requirements#tab:cpp17.copyassignable "Table 34: Cpp17CopyAssignable requirements (in addition to Cpp17MoveAssignable)")) requirements[.](#alg.unique-9.2.2.sentence-3)
|
||
Otherwise, T meets both
|
||
the *Cpp17CopyConstructible* (Table [32](utility.arg.requirements#tab:cpp17.copyconstructible "Table 32: Cpp17CopyConstructible requirements (in addition to Cpp17MoveConstructible)")) and *Cpp17CopyAssignable* requirements[.](#alg.unique-9.2.2.sentence-4)
|
||
|
||
[*Note [1](#alg.unique-note-1)*:
|
||
|
||
For the parallel algorithm overloads in namespace std,
|
||
there can be a performance cost
|
||
if the value type of ForwardIterator1 does not meet both the*Cpp17CopyConstructible* and *Cpp17CopyAssignable* requirements[.](#alg.unique-9.sentence-2)
|
||
|
||
For the parallel algorithm overloads in namespace ranges,
|
||
there can be a performance cost if iter_value_t<I> does not model [copyable](concepts.object#concept:copyable "18.6 Object concepts [concepts.object]")[.](#alg.unique-9.sentence-3)
|
||
|
||
â *end note*]
|
||
|
||
[10](#alg.unique-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8005)
|
||
|
||
*Effects*: Copies only the first element from N consecutive groups of equivalent elements
|
||
referred to by the iterator i in the range [first + 1, last)
|
||
for which E(i) holds
|
||
into the range [result, result + N)[.](#alg.unique-10.sentence-1)
|
||
|
||
[11](#alg.unique-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8012)
|
||
|
||
*Returns*:
|
||
|
||
- [(11.1)](#alg.unique-11.1)
|
||
|
||
result + N for the overloads in namespace std[.](#alg.unique-11.1.sentence-1)
|
||
|
||
- [(11.2)](#alg.unique-11.2)
|
||
|
||
{last, result + N} for the overloads in namespace ranges,
|
||
if N is equal to M+1[.](#alg.unique-11.2.sentence-1)
|
||
|
||
- [(11.3)](#alg.unique-11.3)
|
||
|
||
Otherwise, {j, result_last} for the overloads in namespace ranges,
|
||
where j is the iterator in [first + 1, last)
|
||
for which E(j) is false and there are exactly Nâ1 iterators i in [first + 1, j)
|
||
for which E(i) is false[.](#alg.unique-11.3.sentence-1)
|
||
|
||
[12](#alg.unique-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8031)
|
||
|
||
*Complexity*: At most last - first - 1 applications
|
||
of the corresponding predicate
|
||
and no more than twice as many applications of any projection[.](#alg.unique-12.sentence-1)
|
||
|
||
### [26.7.10](#alg.reverse) Reverse [[alg.reverse]](alg.reverse)
|
||
|
||
[ð](#lib:reverse)
|
||
|
||
`template<class BidirectionalIterator>
|
||
constexpr void reverse(BidirectionalIterator first, BidirectionalIterator last);
|
||
template<class ExecutionPolicy, class BidirectionalIterator>
|
||
void reverse(ExecutionPolicy&& exec,
|
||
BidirectionalIterator first, BidirectionalIterator last);
|
||
|
||
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>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<I>
|
||
constexpr I ranges::reverse(I first, S last);
|
||
template<[bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6 Other range refinements [range.refinements]") R>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<iterator_t<R>>
|
||
constexpr borrowed_iterator_t<R> ranges::reverse(R&& r);
|
||
|
||
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>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<I>
|
||
I ranges::reverse(Ep&& exec, I first, S last);
|
||
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>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<iterator_t<R>>
|
||
borrowed_iterator_t<R> ranges::reverse(Ep&& exec, R&& r);
|
||
`
|
||
|
||
[1](#alg.reverse-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8064)
|
||
|
||
*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"))[.](#alg.reverse-1.sentence-1)
|
||
|
||
[2](#alg.reverse-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8070)
|
||
|
||
*Effects*: For each non-negative integer i < (last - first) / 2,
|
||
applies std::iter_swap, orranges::iter_swap for the overloads in namespace ranges,
|
||
to all pairs of iterators first + i, (last - i) - 1[.](#alg.reverse-2.sentence-1)
|
||
|
||
[3](#alg.reverse-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8077)
|
||
|
||
*Returns*: last for the overloads in namespace ranges[.](#alg.reverse-3.sentence-1)
|
||
|
||
[4](#alg.reverse-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8081)
|
||
|
||
*Complexity*: Exactly (last - first)/2 swaps[.](#alg.reverse-4.sentence-1)
|
||
|
||
[ð](#lib:reverse_copy)
|
||
|
||
`template<class BidirectionalIterator, class OutputIterator>
|
||
constexpr OutputIterator
|
||
reverse_copy(BidirectionalIterator first, BidirectionalIterator last,
|
||
OutputIterator result);
|
||
template<class ExecutionPolicy, class BidirectionalIterator, class ForwardIterator>
|
||
ForwardIterator
|
||
reverse_copy(ExecutionPolicy&& exec,
|
||
BidirectionalIterator first, BidirectionalIterator last,
|
||
ForwardIterator result);
|
||
|
||
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, [weakly_incrementable](iterator.concept.winc#concept:weakly_incrementable "24.3.4.4 Concept weakly_incrementable [iterator.concept.winc]") O>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O>
|
||
constexpr ranges::reverse_copy_result<I, O>
|
||
ranges::reverse_copy(I first, S last, O result);
|
||
template<[bidirectional_range](range.refinements#concept:bidirectional_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]") O>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, O>
|
||
constexpr ranges::reverse_copy_result<borrowed_iterator_t<R>, O>
|
||
ranges::reverse_copy(R&& r, O result);
|
||
`
|
||
|
||
[5](#alg.reverse-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8109)
|
||
|
||
Let N be last - first[.](#alg.reverse-5.sentence-1)
|
||
|
||
[6](#alg.reverse-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8112)
|
||
|
||
*Preconditions*: The ranges [first, last) and [result, result + N)
|
||
do not overlap[.](#alg.reverse-6.sentence-1)
|
||
|
||
[7](#alg.reverse-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8117)
|
||
|
||
*Effects*: Copies the range [first, last) to the range [result, result + N)
|
||
such that for every non-negative integer i < N the following assignment takes place:*(result + N - 1 - i) = *(first + i)[.](#alg.reverse-7.sentence-1)
|
||
|
||
[8](#alg.reverse-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8124)
|
||
|
||
*Returns*:
|
||
|
||
- [(8.1)](#alg.reverse-8.1)
|
||
|
||
result + N for the overloads in namespace std[.](#alg.reverse-8.1.sentence-1)
|
||
|
||
- [(8.2)](#alg.reverse-8.2)
|
||
|
||
{last, result + N} for the overloads in namespace ranges[.](#alg.reverse-8.2.sentence-1)
|
||
|
||
[9](#alg.reverse-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8133)
|
||
|
||
*Complexity*: Exactly N assignments[.](#alg.reverse-9.sentence-1)
|
||
|
||
[ð](#alg.reverse-itemdecl:3)
|
||
|
||
`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]") O, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O> OutS>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O>
|
||
ranges::reverse_copy_truncated_result<I, O>
|
||
ranges::reverse_copy(Ep&& exec, I first, S last, O result,
|
||
OutS result_last);
|
||
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]") OutR>
|
||
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<OutR>>
|
||
ranges::reverse_copy_truncated_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
|
||
ranges::reverse_copy(Ep&& exec, R&& r, OutR&& result_r);
|
||
`
|
||
|
||
[10](#alg.reverse-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8152)
|
||
|
||
Let N be min(last - first, result_last - result),
|
||
and let *NEW_FIRST* be first + (last - first) - N[.](#alg.reverse-10.sentence-1)
|
||
|
||
[11](#alg.reverse-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8156)
|
||
|
||
*Preconditions*: The ranges [first, last) and [result, result + N)
|
||
do not overlap[.](#alg.reverse-11.sentence-1)
|
||
|
||
[12](#alg.reverse-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8161)
|
||
|
||
*Effects*: Copies the range [*NEW_FIRST*, last)
|
||
to the range [result, result + N)
|
||
such that for every non-negative integer i<N the following assignment takes place:*(result + N - 1 - i) = *(*NEW_FIRST* + i)[.](#alg.reverse-12.sentence-1)
|
||
|
||
[13](#alg.reverse-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8169)
|
||
|
||
*Returns*: {last, *NEW_FIRST*, result + N}[.](#alg.reverse-13.sentence-1)
|
||
|
||
[14](#alg.reverse-14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8173)
|
||
|
||
*Complexity*: Exactly N assignments[.](#alg.reverse-14.sentence-1)
|
||
|
||
### [26.7.11](#alg.rotate) Rotate [[alg.rotate]](alg.rotate)
|
||
|
||
[ð](#lib:rotate)
|
||
|
||
`template<class ForwardIterator>
|
||
constexpr ForwardIterator
|
||
rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);
|
||
template<class ExecutionPolicy, class ForwardIterator>
|
||
ForwardIterator
|
||
rotate(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator middle, ForwardIterator last);
|
||
|
||
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>
|
||
constexpr subrange<I> ranges::rotate(I first, I middle, S last);
|
||
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>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<I>
|
||
subrange<I> ranges::rotate(Ep&& exec, I first, I middle, S last);
|
||
`
|
||
|
||
[1](#alg.rotate-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8198)
|
||
|
||
*Preconditions*: [first, middle) and [middle, last) are valid ranges[.](#alg.rotate-1.sentence-1)
|
||
|
||
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")), 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[.](#alg.rotate-1.sentence-2)
|
||
|
||
[2](#alg.rotate-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8208)
|
||
|
||
*Effects*: For each non-negative integer i < (last - first),
|
||
places the element from the position first + i into position first + (i + (last - middle)) % (last - first)[.](#alg.rotate-2.sentence-1)
|
||
|
||
[*Note [1](#alg.rotate-note-1)*:
|
||
|
||
This is a left rotate[.](#alg.rotate-2.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
[3](#alg.rotate-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8217)
|
||
|
||
*Returns*:
|
||
|
||
- [(3.1)](#alg.rotate-3.1)
|
||
|
||
first + (last - middle) for the overloads in namespace std[.](#alg.rotate-3.1.sentence-1)
|
||
|
||
- [(3.2)](#alg.rotate-3.2)
|
||
|
||
{first + (last - middle), last} for the overload in namespace ranges[.](#alg.rotate-3.2.sentence-1)
|
||
|
||
[4](#alg.rotate-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8228)
|
||
|
||
*Complexity*: At most last - first swaps[.](#alg.rotate-4.sentence-1)
|
||
|
||
[ð](#alg.rotate-itemdecl:2)
|
||
|
||
`template<[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") R>
|
||
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::rotate(R&& r, iterator_t<R> middle);
|
||
`
|
||
|
||
[5](#alg.rotate-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8240)
|
||
|
||
*Effects*: Equivalent to:return ranges::rotate(ranges::begin(r), middle, ranges::end(r));
|
||
|
||
[ð](#alg.rotate-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>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<iterator_t<R>>
|
||
borrowed_subrange_t<R> ranges::rotate(Ep&& exec, R&& r, iterator_t<R> middle);
|
||
`
|
||
|
||
[6](#alg.rotate-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8253)
|
||
|
||
*Effects*: Equivalent to:return ranges::rotate(std::forward<Ep>(exec), ranges::begin(r), middle, ranges::end(r));
|
||
|
||
[ð](#lib:rotate_copy)
|
||
|
||
`template<class ForwardIterator, class OutputIterator>
|
||
constexpr OutputIterator
|
||
rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last,
|
||
OutputIterator result);
|
||
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
|
||
ForwardIterator2
|
||
rotate_copy(ExecutionPolicy&& exec,
|
||
ForwardIterator1 first, ForwardIterator1 middle, ForwardIterator1 last,
|
||
ForwardIterator2 result);
|
||
|
||
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, [weakly_incrementable](iterator.concept.winc#concept:weakly_incrementable "24.3.4.4 Concept weakly_incrementable [iterator.concept.winc]") O>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O>
|
||
constexpr ranges::rotate_copy_result<I, O>
|
||
ranges::rotate_copy(I first, I middle, S last, O result);
|
||
`
|
||
|
||
[7](#alg.rotate-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8280)
|
||
|
||
Let N be last - first[.](#alg.rotate-7.sentence-1)
|
||
|
||
[8](#alg.rotate-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8283)
|
||
|
||
*Preconditions*: [first, middle) and [middle, last) are valid ranges[.](#alg.rotate-8.sentence-1)
|
||
|
||
The ranges [first, last) and [result, result + N)
|
||
do not overlap[.](#alg.rotate-8.sentence-2)
|
||
|
||
[9](#alg.rotate-9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8289)
|
||
|
||
*Effects*: Copies the range [first, last) to the range [result, result + N)
|
||
such that for each non-negative integer i<N the following assignment takes place:*(result + i) = *(first + (i + (middle - first)) % N)[.](#alg.rotate-9.sentence-1)
|
||
|
||
[10](#alg.rotate-10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8296)
|
||
|
||
*Returns*:
|
||
|
||
- [(10.1)](#alg.rotate-10.1)
|
||
|
||
result + N for the overloads in namespace std[.](#alg.rotate-10.1.sentence-1)
|
||
|
||
- [(10.2)](#alg.rotate-10.2)
|
||
|
||
{last, result + N} for the overload in namespace ranges[.](#alg.rotate-10.2.sentence-1)
|
||
|
||
[11](#alg.rotate-11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8305)
|
||
|
||
*Complexity*: Exactly N assignments[.](#alg.rotate-11.sentence-1)
|
||
|
||
[ð](#alg.rotate-itemdecl:5)
|
||
|
||
`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]") O, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<O> OutS>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O>
|
||
ranges::rotate_copy_truncated_result<I, O>
|
||
ranges::rotate_copy(Ep&& exec, I first, I middle, S last, O result, OutS result_last);
|
||
`
|
||
|
||
[12](#alg.rotate-12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8319)
|
||
|
||
Let M be last - first and N be min(M, result_last - result)[.](#alg.rotate-12.sentence-1)
|
||
|
||
[13](#alg.rotate-13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8323)
|
||
|
||
*Preconditions*: [first, middle) and [middle, last)
|
||
are valid ranges[.](#alg.rotate-13.sentence-1)
|
||
|
||
The ranges [first, last) and [result, result + N)
|
||
do not overlap[.](#alg.rotate-13.sentence-2)
|
||
|
||
[14](#alg.rotate-14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8330)
|
||
|
||
*Effects*: Copies the range [first, last)
|
||
to the range [result, result + N)
|
||
such that for each non-negative integer i<N the following assignment takes place:*(result + i) = *(first + (i + (middle - first)) % M)[.](#alg.rotate-14.sentence-1)
|
||
|
||
[15](#alg.rotate-15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8338)
|
||
|
||
*Returns*:
|
||
|
||
- [(15.1)](#alg.rotate-15.1)
|
||
|
||
{middle + N, first, result + N} if N is less than last - middle[.](#alg.rotate-15.1.sentence-1)
|
||
|
||
- [(15.2)](#alg.rotate-15.2)
|
||
|
||
Otherwise, {last, first + (N + (middle - first)) % M, result + N}[.](#alg.rotate-15.2.sentence-1)
|
||
|
||
[16](#alg.rotate-16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8349)
|
||
|
||
*Complexity*: Exactly N assignments[.](#alg.rotate-16.sentence-1)
|
||
|
||
[ð](#alg.rotate-itemdecl:6)
|
||
|
||
`template<[forward_range](range.refinements#concept:forward_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]") O>
|
||
requires [indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, O>
|
||
constexpr ranges::rotate_copy_result<borrowed_iterator_t<R>, O>
|
||
ranges::rotate_copy(R&& r, iterator_t<R> middle, O result);
|
||
`
|
||
|
||
[17](#alg.rotate-17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8362)
|
||
|
||
*Effects*: Equivalent to:return ranges::rotate_copy(ranges::begin(r), middle, ranges::end(r), std::move(result));
|
||
|
||
[ð](#alg.rotate-itemdecl:7)
|
||
|
||
`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]") OutR>
|
||
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<OutR>>
|
||
ranges::rotate_copy_truncated_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
|
||
ranges::rotate_copy(Ep&& exec, R&& r, iterator_t<R> middle, OutR&& result_r);
|
||
`
|
||
|
||
[18](#alg.rotate-18)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8378)
|
||
|
||
*Effects*: Equivalent to:return ranges::rotate_copy(std::forward<Ep>(exec), ranges::begin(r), middle, ranges::end(r),
|
||
ranges::begin(result_r), ranges::end(result_r));
|
||
|
||
### [26.7.12](#alg.random.sample) Sample [[alg.random.sample]](alg.random.sample)
|
||
|
||
[ð](#lib:sample)
|
||
|
||
`template<class PopulationIterator, class SampleIterator,
|
||
class Distance, class UniformRandomBitGenerator>
|
||
SampleIterator sample(PopulationIterator first, PopulationIterator last,
|
||
SampleIterator out, Distance n,
|
||
UniformRandomBitGenerator&& g);
|
||
|
||
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]") O, class Gen>
|
||
requires ([forward_iterator](iterator.concept.forward#concept:forward_iterator "24.3.4.11 Concept forward_iterator [iterator.concept.forward]")<I> || [random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]")<O>) &&
|
||
[indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<I, O> &&
|
||
[uniform_random_bit_generator](rand.req.urng#concept:uniform_random_bit_generator "29.5.3.3 Uniform random bit generator requirements [rand.req.urng]")<remove_reference_t<Gen>>
|
||
O ranges::sample(I first, S last, O out, iter_difference_t<I> n, Gen&& g);
|
||
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]") O, class Gen>
|
||
requires ([forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]")<R> || [random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]")<O>) &&
|
||
[indirectly_copyable](alg.req.ind.copy#concept:indirectly_copyable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, O> &&
|
||
[uniform_random_bit_generator](rand.req.urng#concept:uniform_random_bit_generator "29.5.3.3 Uniform random bit generator requirements [rand.req.urng]")<remove_reference_t<Gen>>
|
||
O ranges::sample(R&& r, O out, range_difference_t<R> n, Gen&& g);
|
||
`
|
||
|
||
[1](#alg.random.sample-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8410)
|
||
|
||
*Mandates*: For the overload in namespace std,Distance is an integer type and*first is writable ([[iterator.requirements.general]](iterator.requirements.general "24.3.1 General")) to out[.](#alg.random.sample-1.sentence-1)
|
||
|
||
[2](#alg.random.sample-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8416)
|
||
|
||
*Preconditions*: out is not in the range [first, last)[.](#alg.random.sample-2.sentence-1)
|
||
|
||
For the overload in namespace std:
|
||
|
||
- [(2.1)](#alg.random.sample-2.1)
|
||
|
||
PopulationIterator meets
|
||
the [*Cpp17InputIterator*](input.iterators#:Cpp17InputIterator "24.3.5.3 Input iterators [input.iterators]") requirements ([[input.iterators]](input.iterators "24.3.5.3 Input iterators"))[.](#alg.random.sample-2.1.sentence-1)
|
||
|
||
- [(2.2)](#alg.random.sample-2.2)
|
||
|
||
SampleIterator meets
|
||
the [*Cpp17OutputIterator*](output.iterators#:Cpp17OutputIterator "24.3.5.4 Output iterators [output.iterators]") requirements ([[output.iterators]](output.iterators "24.3.5.4 Output iterators"))[.](#alg.random.sample-2.2.sentence-1)
|
||
|
||
- [(2.3)](#alg.random.sample-2.3)
|
||
|
||
SampleIterator meets
|
||
the [*Cpp17RandomAccessIterator*](random.access.iterators#:Cpp17RandomAccessIterator "24.3.5.7 Random access iterators [random.access.iterators]") requirements ([[random.access.iterators]](random.access.iterators "24.3.5.7 Random access iterators"))
|
||
unless PopulationIterator models [forward_iterator](iterator.concept.forward#concept:forward_iterator "24.3.4.11 Concept forward_iterator [iterator.concept.forward]") ([[iterator.concept.forward]](iterator.concept.forward "24.3.4.11 Concept forward_iterator"))[.](#alg.random.sample-2.3.sentence-1)
|
||
|
||
- [(2.4)](#alg.random.sample-2.4)
|
||
|
||
remove_reference_t<UniformRandomBitGenerator> meets
|
||
the requirements of a uniform random bit generator type ([[rand.req.urng]](rand.req.urng "29.5.3.3 Uniform random bit generator requirements"))[.](#alg.random.sample-2.4.sentence-1)
|
||
|
||
[3](#alg.random.sample-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8437)
|
||
|
||
*Effects*: Copies min(last - first, n) elements (the [*sample*](#def:sample "26.7.12 Sample [alg.random.sample]"))
|
||
from [first, last) (the [*population*](#def:population "26.7.12 Sample [alg.random.sample]")) to out such that each possible sample has equal probability of appearance[.](#alg.random.sample-3.sentence-1)
|
||
|
||
[*Note [1](#alg.random.sample-note-1)*:
|
||
|
||
Algorithms that obtain such effects include [*selection sampling*](#def:selection_sampling) and [*reservoir sampling*](#def:reservoir_sampling)[.](#alg.random.sample-3.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
[4](#alg.random.sample-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8447)
|
||
|
||
*Returns*: The end of the resulting sample range[.](#alg.random.sample-4.sentence-1)
|
||
|
||
[5](#alg.random.sample-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8451)
|
||
|
||
*Complexity*: O(last - first)[.](#alg.random.sample-5.sentence-1)
|
||
|
||
[6](#alg.random.sample-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8455)
|
||
|
||
*Remarks*:
|
||
|
||
- [(6.1)](#alg.random.sample-6.1)
|
||
|
||
For the overload in namespace std,
|
||
stable if and only if PopulationIterator models [forward_iterator](iterator.concept.forward#concept:forward_iterator "24.3.4.11 Concept forward_iterator [iterator.concept.forward]")[.](#alg.random.sample-6.1.sentence-1)
|
||
For the first overload in namespace ranges,
|
||
stable if and only if I models [forward_iterator](iterator.concept.forward#concept:forward_iterator "24.3.4.11 Concept forward_iterator [iterator.concept.forward]")[.](#alg.random.sample-6.1.sentence-2)
|
||
|
||
- [(6.2)](#alg.random.sample-6.2)
|
||
|
||
To the extent that the implementation of this function makes use
|
||
of random numbers, the object g serves as
|
||
the implementation's source of randomness[.](#alg.random.sample-6.2.sentence-1)
|
||
|
||
### [26.7.13](#alg.random.shuffle) Shuffle [[alg.random.shuffle]](alg.random.shuffle)
|
||
|
||
[ð](#lib:shuffle)
|
||
|
||
`template<class RandomAccessIterator, class UniformRandomBitGenerator>
|
||
void shuffle(RandomAccessIterator first,
|
||
RandomAccessIterator last,
|
||
UniformRandomBitGenerator&& g);
|
||
|
||
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 Gen>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<I> &&
|
||
[uniform_random_bit_generator](rand.req.urng#concept:uniform_random_bit_generator "29.5.3.3 Uniform random bit generator requirements [rand.req.urng]")<remove_reference_t<Gen>>
|
||
I ranges::shuffle(I first, S last, Gen&& g);
|
||
template<[random_access_range](range.refinements#concept:random_access_range "25.4.6 Other range refinements [range.refinements]") R, class Gen>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<iterator_t<R>> &&
|
||
[uniform_random_bit_generator](rand.req.urng#concept:uniform_random_bit_generator "29.5.3.3 Uniform random bit generator requirements [rand.req.urng]")<remove_reference_t<Gen>>
|
||
borrowed_iterator_t<R> ranges::shuffle(R&& r, Gen&& g);
|
||
`
|
||
|
||
[1](#alg.random.shuffle-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8491)
|
||
|
||
*Preconditions*: For the overload in namespace std:
|
||
|
||
- [(1.1)](#alg.random.shuffle-1.1)
|
||
|
||
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"))[.](#alg.random.shuffle-1.1.sentence-1)
|
||
|
||
- [(1.2)](#alg.random.shuffle-1.2)
|
||
|
||
The type remove_reference_t<UniformRandomBitGenerator> meets
|
||
the uniform random bit generator ([[rand.req.urng]](rand.req.urng "29.5.3.3 Uniform random bit generator requirements")) requirements[.](#alg.random.shuffle-1.2.sentence-1)
|
||
|
||
[2](#alg.random.shuffle-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8503)
|
||
|
||
*Effects*: Permutes the elements in the range [first, last)
|
||
such that each possible permutation of those elements
|
||
has equal probability of appearance[.](#alg.random.shuffle-2.sentence-1)
|
||
|
||
[3](#alg.random.shuffle-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8509)
|
||
|
||
*Returns*: last for the overloads in namespace ranges[.](#alg.random.shuffle-3.sentence-1)
|
||
|
||
[4](#alg.random.shuffle-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8513)
|
||
|
||
*Complexity*: Exactly (last - first) - 1 swaps[.](#alg.random.shuffle-4.sentence-1)
|
||
|
||
[5](#alg.random.shuffle-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8517)
|
||
|
||
*Remarks*: To the extent that the implementation of this function makes use
|
||
of random numbers, the object referenced by g shall serve as
|
||
the implementation's source of randomness[.](#alg.random.shuffle-5.sentence-1)
|
||
|
||
### [26.7.14](#alg.shift) Shift [[alg.shift]](alg.shift)
|
||
|
||
[ð](#lib:shift_left)
|
||
|
||
`template<class ForwardIterator>
|
||
constexpr ForwardIterator
|
||
shift_left(ForwardIterator first, ForwardIterator last,
|
||
typename iterator_traits<ForwardIterator>::difference_type n);
|
||
template<class ExecutionPolicy, class ForwardIterator>
|
||
ForwardIterator
|
||
shift_left(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last,
|
||
typename iterator_traits<ForwardIterator>::difference_type n);
|
||
|
||
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>
|
||
constexpr subrange<I> ranges::shift_left(I first, S last, iter_difference_t<I> n);
|
||
template<[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") R>
|
||
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::shift_left(R&& r, range_difference_t<R> n);
|
||
|
||
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>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<I>
|
||
subrange<I>
|
||
ranges::shift_left(Ep&& exec, I first, S last, iter_difference_t<I> n);
|
||
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>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<iterator_t<R>>
|
||
borrowed_subrange_t<R>
|
||
ranges::shift_left(Ep&& exec, R&& r, range_difference_t<R> n);
|
||
`
|
||
|
||
[1](#alg.shift-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8554)
|
||
|
||
*Preconditions*: n >= 0 is true[.](#alg.shift-1.sentence-1)
|
||
|
||
For the overloads in namespace std,
|
||
the type of *first meets the [*Cpp17MoveAssignable*](utility.arg.requirements#:Cpp17MoveAssignable "16.4.4.2 Template argument requirements [utility.arg.requirements]") requirements[.](#alg.shift-1.sentence-2)
|
||
|
||
[2](#alg.shift-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8560)
|
||
|
||
*Effects*: If n == 0 or n >= last - first, does nothing[.](#alg.shift-2.sentence-1)
|
||
|
||
Otherwise, moves the element
|
||
from position first + n + i into position first + i for each non-negative integer i < (last - first) - n[.](#alg.shift-2.sentence-2)
|
||
|
||
For the non-parallel algorithm overloads,
|
||
does so in order starting
|
||
from i = 0 and proceeding to i = (last - first) - n - 1[.](#alg.shift-2.sentence-3)
|
||
|
||
[3](#alg.shift-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8571)
|
||
|
||
*Returns*: Let *NEW_LAST* be first + (last - first - n) if n < last - first,
|
||
otherwise first[.](#alg.shift-3.sentence-1)
|
||
|
||
Returns:
|
||
|
||
- [(3.1)](#alg.shift-3.1)
|
||
|
||
*NEW_LAST* for the overloads in namespace std[.](#alg.shift-3.1.sentence-1)
|
||
|
||
- [(3.2)](#alg.shift-3.2)
|
||
|
||
{first, *NEW_LAST*} for the overloads in namespace ranges[.](#alg.shift-3.2.sentence-1)
|
||
|
||
[4](#alg.shift-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8585)
|
||
|
||
*Complexity*: At most (last - first) - n assignments[.](#alg.shift-4.sentence-1)
|
||
|
||
[ð](#lib:shift_right)
|
||
|
||
`template<class ForwardIterator>
|
||
constexpr ForwardIterator
|
||
shift_right(ForwardIterator first, ForwardIterator last,
|
||
typename iterator_traits<ForwardIterator>::difference_type n);
|
||
template<class ExecutionPolicy, class ForwardIterator>
|
||
ForwardIterator
|
||
shift_right(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last,
|
||
typename iterator_traits<ForwardIterator>::difference_type n);
|
||
|
||
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>
|
||
constexpr subrange<I> ranges::shift_right(I first, S last, iter_difference_t<I> n);
|
||
template<[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") R>
|
||
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::shift_right(R&& r, range_difference_t<R> n);
|
||
|
||
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>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<I>
|
||
subrange<I>
|
||
ranges::shift_right(Ep&& exec, I first, S last, iter_difference_t<I> n);
|
||
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>
|
||
requires [permutable](alg.req.permutable#concept:permutable "24.3.7.6 Concept permutable [alg.req.permutable]")<iterator_t<R>>
|
||
borrowed_subrange_t<R>
|
||
ranges::shift_right(Ep&& exec, R&& r, range_difference_t<R> n);
|
||
`
|
||
|
||
[5](#alg.shift-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8618)
|
||
|
||
*Preconditions*: n >= 0 is true[.](#alg.shift-5.sentence-1)
|
||
|
||
For the overloads in namespace std,
|
||
the type of *first meets the [*Cpp17MoveAssignable*](utility.arg.requirements#:Cpp17MoveAssignable "16.4.4.2 Template argument requirements [utility.arg.requirements]") requirements,
|
||
and ForwardIterator meets
|
||
the [*Cpp17BidirectionalIterator*](bidirectional.iterators#:Cpp17BidirectionalIterator "24.3.5.6 Bidirectional iterators [bidirectional.iterators]") requirements ([[bidirectional.iterators]](bidirectional.iterators "24.3.5.6 Bidirectional iterators")) or
|
||
the [*Cpp17ValueSwappable*](swappable.requirements#:Cpp17ValueSwappable "16.4.4.3 Swappable requirements [swappable.requirements]") requirements[.](#alg.shift-5.sentence-2)
|
||
|
||
[6](#alg.shift-6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8627)
|
||
|
||
*Effects*: If n == 0 or n >= last - first, does nothing[.](#alg.shift-6.sentence-1)
|
||
|
||
Otherwise, moves the element
|
||
from position first + i into position first + n + i for each non-negative integer i < (last - first) - n[.](#alg.shift-6.sentence-2)
|
||
|
||
Does so in order starting
|
||
from i = (last - first) - n - 1 and proceeding to i = 0 if
|
||
|
||
- [(6.1)](#alg.shift-6.1)
|
||
|
||
for the non-parallel algorithm overload in namespace std,ForwardIterator meets the *Cpp17BidirectionalIterator* requirements,
|
||
|
||
- [(6.2)](#alg.shift-6.2)
|
||
|
||
for the non-parallel algorithm overloads in namespace ranges,I models [bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12 Concept bidirectional_iterator [iterator.concept.bidir]")[.](#alg.shift-6.sentence-3)
|
||
|
||
[7](#alg.shift-7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8644)
|
||
|
||
*Returns*: Let *NEW_FIRST* be first + n if n < last - first,
|
||
otherwise last[.](#alg.shift-7.sentence-1)
|
||
|
||
Returns:
|
||
|
||
- [(7.1)](#alg.shift-7.1)
|
||
|
||
*NEW_FIRST* for the overloads in namespace std[.](#alg.shift-7.1.sentence-1)
|
||
|
||
- [(7.2)](#alg.shift-7.2)
|
||
|
||
{*NEW_FIRST*, last} for the overloads in namespace ranges[.](#alg.shift-7.2.sentence-1)
|
||
|
||
[8](#alg.shift-8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L8657)
|
||
|
||
*Complexity*: At most (last - first) - n assignments or swaps[.](#alg.shift-8.sentence-1)
|