Constrained algorithms and algorithms on ranges(C++20) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Constrained algorithms, e.g.ranges::copy,ranges::sort, ... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Execution policies(C++17) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Numeric operations | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Operations on uninitialized memory | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Defined in header <algorithm> | ||
template<class InputIt,class RandomIt> RandomIt partial_sort_copy( InputIt first, InputIt last, | (1) | (constexpr since C++20) |
template<class ExecutionPolicy, class ForwardIt,class RandomIt> | (2) | (since C++17) |
template<class InputIt,class RandomIt,class Compare> RandomIt partial_sort_copy( InputIt first, InputIt last, | (3) | (constexpr since C++20) |
template<class ExecutionPolicy, class ForwardIt,class RandomIt,class Compare> | (4) | (since C++17) |
Sorts some of the elements in the range[
first,
last)
in ascending order, storing the result in the range[
d_first,
d_last)
.
At mostd_last- d_first of the elements are placed sorted to the range[
d_first,
d_first+ n)
.n is the number of elements to sort (std::min(std::distance(first, last), d_last- d_first)). The order of equal elements is not guaranteed to be preserved.
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> istrue. | (until C++20) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> istrue. | (since C++20) |
If*first is notwritable tod_first, the program is ill-formed.
If any of the following conditions is satisfied, the behavior is undefined:
| (until C++11) |
| (since C++11) |
Contents |
first, last | - | the pair of iterators defining therange of elements to sort |
d_first, d_last | - | the pair of iterators defining therange of elements to which the sorted data will be assigned |
policy | - | theexecution policy to use |
comp | - | comparison function object (i.e. an object that satisfies the requirements ofCompare) which returns true if the first argument isless than (i.e. is orderedbefore) the second. The signature of the comparison function should be equivalent to the following: bool cmp(const Type1& a,const Type2& b); While the signature does not need to haveconst&, the function must not modify the objects passed to it and must be able to accept all values of type (possibly const) |
Type requirements | ||
-InputIt must meet the requirements ofLegacyInputIterator. | ||
-ForwardIt must meet the requirements ofLegacyForwardIterator. | ||
-RandomIt must meet the requirements ofLegacyRandomAccessIterator. | ||
-Compare must meet the requirements ofCompare. |
An iterator to the element defining the upper boundary of the sorted range, i.e.d_first+std::min(std::distance(first, last), d_last- d_first).
Given\(\scriptsize N\)N asstd::distance(first, last),\(\scriptsize D\)D asd_last- d_first:
The overloads with a template parameter namedExecutionPolicy
report errors as follows:
ExecutionPolicy
is one of thestandard policies,std::terminate is called. For any otherExecutionPolicy
, the behavior is implementation-defined.See also the implementations inlibstdc++ andlibc++.
The following code sorts a vector of integers and copies them into a smaller and a larger vector.
#include <algorithm>#include <functional>#include <iostream>#include <string_view>#include <type_traits>#include <vector> void println(std::string_view rem,constauto& v){std::cout<< rem;ifconstexpr(std::is_scalar_v<std::decay_t<decltype(v)>>)std::cout<< v;elsefor(int e: v)std::cout<< e<<' ';std::cout<<'\n';} int main(){constauto v0={4,2,5,1,3};std::vector<int> v1{10,11,12};std::vector<int> v2{10,11,12,13,14,15,16};std::vector<int>::iterator it; it= std::partial_sort_copy(v0.begin(), v0.end(), v1.begin(), v1.end()); println("Writing to the smaller vector in ascending order gives: ", v1); if(it== v1.end()) println("The return value is the end iterator",' '); it= std::partial_sort_copy(v0.begin(), v0.end(), v2.begin(), v2.end(),std::greater<int>()); println("Writing to the larger vector in descending order gives: ", v2); println("The return value is the iterator to ",*it);}
Output:
Writing to the smaller vector in ascending order gives: 1 2 3The return value is the end iteratorWriting to the larger vector in descending order gives: 5 4 3 2 1 15 16The return value is the iterator to 15
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
P0896R4 | C++98 | *first was not required to be writable tod_first | the program is ill-formed if not writable |
sorts the first N elements of a range (function template)[edit] | |
sorts a range into ascending order (function template)[edit] | |
sorts a range of elements while preserving order between equal elements (function template)[edit] | |
(C++20) | copies and partially sorts a range of elements (algorithm function object)[edit] |