[alg.sort] (original) (raw)

25 Algorithms library [algorithms]

25.8.1 Sorting [alg.sort]

25.8.1.1 sort [sort]

template<class RandomAccessIterator> constexpr void sort(RandomAccessIterator first, RandomAccessIterator last);template<class ExecutionPolicy, class RandomAccessIterator> void sort(ExecutionPolicy&& exec, RandomAccessIterator first, RandomAccessIterator last);template<class RandomAccessIterator, class Compare> constexpr void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);template<class ExecutionPolicy, class RandomAccessIterator, class Compare> void sort(ExecutionPolicy&& exec, RandomAccessIterator first, RandomAccessIterator last, Compare comp);template<random_­access_­iterator I, sentinel_­for<I> S, class Comp = ranges::less,class Proj = identity> requires sortable<I, Comp, Proj> constexpr I ranges::sort(I first, S last, Comp comp = {}, Proj proj = {});template<random_­access_­range R, class Comp = ranges::less, class Proj = identity> requires sortable<iterator_t<R>, Comp, Proj> constexpr borrowed_iterator_t<R> ranges::sort(R&& r, Comp comp = {}, Proj proj = {});

Let comp be less{}and proj be identity{}for the overloads with no parameters by those names.

Preconditions:For the overloads in namespace std,RandomAccessIterator meets the Cpp17ValueSwappable requirements ([swappable.requirements]) and the type of *first meets the Cpp17MoveConstructible (Table 28) andCpp17MoveAssignable (Table 30) requirements.

Effects:Sorts the elements in the range [first, last)with respect to comp and proj.

Returns: last for the overloads in namespace ranges.

Complexity:Let N be last - first.

comparisons and projections.

25.8.1.2 stable_­sort [stable.sort]

template<class RandomAccessIterator> void stable_sort(RandomAccessIterator first, RandomAccessIterator last);template<class ExecutionPolicy, class RandomAccessIterator> void stable_sort(ExecutionPolicy&& exec, RandomAccessIterator first, RandomAccessIterator last);template<class RandomAccessIterator, class Compare> void stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);template<class ExecutionPolicy, class RandomAccessIterator, class Compare> void stable_sort(ExecutionPolicy&& exec, RandomAccessIterator first, RandomAccessIterator last, Compare comp);template<random_­access_­iterator I, sentinel_­for<I> S, class Comp = ranges::less,class Proj = identity> requires sortable<I, Comp, Proj> I ranges::stable_sort(I first, S last, Comp comp = {}, Proj proj = {});template<random_­access_­range R, class Comp = ranges::less, class Proj = identity> requires sortable<iterator_t<R>, Comp, Proj> borrowed_iterator_t<R> ranges::stable_sort(R&& r, Comp comp = {}, Proj proj = {});

Let comp be less{}and proj be identity{}for the overloads with no parameters by those names.

Preconditions:For the overloads in namespace std,RandomAccessIterator meets the Cpp17ValueSwappable requirements ([swappable.requirements]) and the type of *first meets the Cpp17MoveConstructible (Table 28) andCpp17MoveAssignable (Table 30) requirements.

Effects:Sorts the elements in the range [first, last)with respect to comp and proj.

Returns: last for the overloads in namespace ranges.

Complexity:Let N be last - first.

If enough extra memory is available, comparisons.

Otherwise, at most comparisons.

In either case, twice as many projections as the number of comparisons.

25.8.1.3 partial_­sort [partial.sort]

template<class RandomAccessIterator> constexpr void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);template<class ExecutionPolicy, class RandomAccessIterator> void partial_sort(ExecutionPolicy&& exec, RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);template<class RandomAccessIterator, class Compare> constexpr void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);template<class ExecutionPolicy, class RandomAccessIterator, class Compare> void partial_sort(ExecutionPolicy&& exec, RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);template<random_­access_­iterator I, sentinel_­for<I> S, class Comp = ranges::less,class Proj = identity> requires sortable<I, Comp, Proj> constexpr I ranges::partial_sort(I first, I middle, S last, Comp comp = {}, Proj proj = {});

Let comp be less{}and proj be identity{}for the overloads with no parameters by those names.

Preconditions: [first, middle) and [middle, last) are valid ranges.

For the overloads in namespace std,RandomAccessIterator meets the Cpp17ValueSwappable requirements ([swappable.requirements]) and the type of *first meets the Cpp17MoveConstructible (Table 28) andCpp17MoveAssignable (Table 30) requirements.

Effects:Places the first middle - first elements from the range [first, last)as sorted with respect to comp and projinto the range [first, middle).

The rest of the elements in the range [middle, last)are placed in an unspecified order.

Returns: last for the overload in namespace ranges.

Complexity:Approximately (last - first) * log(middle - first) comparisons, and twice as many projections.

template<random_­access_­range R, class Comp = ranges::less, class Proj = identity> requires sortable<iterator_t<R>, Comp, Proj> constexpr borrowed_iterator_t<R> ranges::partial_sort(R&& r, iterator_t<R> middle, Comp comp = {}, Proj proj = {});

Effects:Equivalent to:

return ranges::partial_sort(ranges::begin(r), middle, ranges::end(r), comp, proj);

25.8.1.4 partial_­sort_­copy [partial.sort.copy]

template<class InputIterator, class RandomAccessIterator> constexpr RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last);template<class ExecutionPolicy, class ForwardIterator, class RandomAccessIterator> RandomAccessIterator partial_sort_copy(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last);template<class InputIterator, class RandomAccessIterator,class Compare> constexpr RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp);template<class ExecutionPolicy, class ForwardIterator, class RandomAccessIterator,class Compare> RandomAccessIterator partial_sort_copy(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp);template<input_­iterator I1, sentinel_­for<I1> S1, random_­access_­iterator I2, sentinel_­for<I2> S2,class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity> requires indirectly_­copyable<I1, I2> && sortable<I2, Comp, Proj2> && indirect_­strict_­weak_­order<Comp, projected<I1, Proj1>, projected<I2, Proj2>> constexpr ranges::partial_sort_copy_result<I1, I2> ranges::partial_sort_copy(I1 first, S1 last, I2 result_first, S2 result_last, Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {});template<input_­range R1, random_­access_­range R2, class Comp = ranges::less,class Proj1 = identity, class Proj2 = identity> requires indirectly_­copyable<iterator_t<R1>, iterator_t<R2>> && sortable<iterator_t<R2>, Comp, Proj2> && indirect_­strict_­weak_­order<Comp, projected<iterator_t<R1>, Proj1>, projected<iterator_t<R2>, Proj2>> constexpr ranges::partial_sort_copy_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>> ranges::partial_sort_copy(R1&& r, R2&& result_r, Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {});

Let N be .

Let comp be less{}, andproj1 and proj2 be identity{}for the overloads with no parameters by those names.

Preconditions:For the overloads in namespace std,RandomAccessIterator meets the Cpp17ValueSwappable requirements ([swappable.requirements]), the type of *result_­first meets the Cpp17MoveConstructible (Table 28) andCpp17MoveAssignable (Table 30) requirements.

Preconditions:For iterators a1 and b1 in [first, last), and iterators x2 and y2 in [result_­first, result_­last), after evaluating the assignment *y2 = *b1, let E be the value of

bool(invoke(comp, invoke(proj1, *a1), invoke(proj2, *y2))).

Then, after evaluating the assignment *x2 = *a1, E is equal to

bool(invoke(comp, invoke(proj2, *x2), invoke(proj2, *y2))).

[ Note

: Writing a value from the input range into the output range does not affect how it is ordered by comp and proj1 or proj2. — end note

]

Effects:Places the first N elements as sorted with respect to comp and proj2into the range [result_­first, result_­first + N).

Returns:

Complexity:Approximately (last - first) * log N comparisons, and twice as many projections.

25.8.1.5 is_­sorted [is.sorted]

template<class ForwardIterator> constexpr bool is_sorted(ForwardIterator first, ForwardIterator last);

Effects:Equivalent to: return is_­sorted_­until(first, last) == last;

template<class ExecutionPolicy, class ForwardIterator> bool is_sorted(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last);

Effects:Equivalent to:

return is_sorted_until(std::forward(exec), first, last) == last;

template<class ForwardIterator, class Compare> constexpr bool is_sorted(ForwardIterator first, ForwardIterator last, Compare comp);

Effects:Equivalent to: return is_­sorted_­until(first, last, comp) == last;

template<class ExecutionPolicy, class ForwardIterator, class Compare> bool is_sorted(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last, Compare comp);

Effects:Equivalent to:

return is_sorted_until(std::forward(exec), first, last, comp) == last;

template<forward_­iterator I, sentinel_­for<I> S, class Proj = identity,indirect_­strict_­weak_­order<projected<I, Proj>> Comp = ranges::less> constexpr bool ranges::is_sorted(I first, S last, Comp comp = {}, Proj proj = {});template<forward_­range R, class Proj = identity,indirect_­strict_­weak_­order<projected<iterator_t<R>, Proj>> Comp = ranges::less> constexpr bool ranges::is_sorted(R&& r, Comp comp = {}, Proj proj = {});

Effects:Equivalent to:return ranges​::​is_­sorted_­until(first, last, comp, proj) == last;

template<class ForwardIterator> constexpr ForwardIterator is_sorted_until(ForwardIterator first, ForwardIterator last);template<class ExecutionPolicy, class ForwardIterator> ForwardIterator is_sorted_until(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last);template<class ForwardIterator, class Compare> constexpr ForwardIterator is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp);template<class ExecutionPolicy, class ForwardIterator, class Compare> ForwardIterator is_sorted_until(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last, Compare comp);template<forward_­iterator I, sentinel_­for<I> S, class Proj = identity,indirect_­strict_­weak_­order<projected<I, Proj>> Comp = ranges::less> constexpr I ranges::is_sorted_until(I first, S last, Comp comp = {}, Proj proj = {});template<forward_­range R, class Proj = identity,indirect_­strict_­weak_­order<projected<iterator_t<R>, Proj>> Comp = ranges::less> constexpr borrowed_iterator_t<R> ranges::is_sorted_until(R&& r, Comp comp = {}, Proj proj = {});

Let comp be less{}and proj be identity{}for the overloads with no parameters by those names.

Returns:The last iterator i in [first, last]for which the range [first, i)is sorted with respect to comp and proj.