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 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
std::ranges
Non-modifying sequence operations | |||||||||||||||||||||||||||||||||
Modifying sequence operations | |||||||||||||||||||||||||||||||||
Partitioning operations | |||||||||||||||||||||||||||||||||
Sorting operations | |||||||||||||||||||||||||||||||||
Binary search operations (on sorted ranges) | |||||||||||||||||||||||||||||||||
Set operations (on sorted ranges) | |||||||||||||||||||||||||||||||||
Heap operations | |||||||||||||||||||||||||||||||||
Minimum/maximum operations | |||||||||||||||||||||||||||||||||
Permutation operations | |||||||||||||||||||||||||||||||||
Fold operations | |||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||
Operations on uninitialized storage | |||||||||||||||||||||||||||||||||
Return types | |||||||||||||||||||||||||||||||||
Defined in header <algorithm> | ||
Call signature | ||
template<std::input_iterator I1,std::sentinel_for<I1> S1, std::input_iterator I2,std::sentinel_for<I2> S2, | (1) | (since C++20) |
template<ranges::input_range R1,ranges::input_range R2, std::weakly_incrementable O,class Comp=ranges::less, | (2) | (since C++20) |
Helper types | ||
template<class I1,class I2,class O> using set_union_result=ranges::in_in_out_result<I1, I2, O>; | (3) | (since C++20) |
Constructs a sorted union beginning atresult consisting of the set of elements present in one or both sorted input ranges[
first1,
last1)
and[
first2,
last2)
.
If some element is foundm
times in[
first1,
last1)
andn
times in[
first2,
last2)
, then allm
elements will be copied from[
first1,
last1)
toresult, preserving order, and then exactlymax(n- m,0) elements will be copied from[
first2,
last2)
toresult, also preserving order.
The behavior is undefined if
The function-like entities described on this page arealgorithm function objects (informally known asniebloids), that is:
Contents |
first1, last1 | - | the iterator-sentinel pair defining the first input sortedrange of elements |
first2, last2 | - | the iterator-sentinel pair defining the second input sortedrange of elements |
r1 | - | the first input sorted range |
r2 | - | the second input sorted range |
result | - | the beginning of the output range |
comp | - | comparison to apply to the projected elements |
proj1 | - | projection to apply to the elements in the first range |
proj2 | - | projection to apply to the elements in the second range |
{last1, last2, result_last}, whereresult_last is the end of the constructed range.
At most\(\scriptsize 2\cdot(N_1+N_2)-1\)2·(N1+N2)-1 comparisons and applications of each projection, where\(\scriptsize N_1\)N1 and\(\scriptsize N_2\)N2 areranges::distance(first1, last1) andranges::distance(first2, last2), respectively.
This algorithm performs a similar task asranges::merge does. Both consume two sorted input ranges and produce a sorted output with elements from both inputs. The difference between these two algorithms is with handling values from both input ranges which compare equivalent (see notes onLessThanComparable). If any equivalent values appearedn
times in the first range andm
times in the second,ranges::merge would output alln+m occurrences whereasranges::set_union
would outputstd::max(n, m) ones only. Soranges::merge outputs exactly\(\scriptsize (N_1+N_2)\)(N1+N2) values andranges::set_union
may produce less.
struct set_union_fn{template<std::input_iterator I1,std::sentinel_for<I1> S1,std::input_iterator I2,std::sentinel_for<I2> S2,std::weakly_incrementable O,class Comp=ranges::less,class Proj1=std::identity,class Proj2=std::identity> requiresstd::mergeable<I1, I2, O, Comp, Proj1, Proj2>constexpr ranges::set_union_result<I1, I2, O> operator()(I1 first1, S1 last1, I2 first2, S2 last2, O result, Comp comp={}, Proj1 proj1={}, Proj2 proj2={})const{for(;!(first1== last1 or first2== last2);++result){if(std::invoke(comp,std::invoke(proj1,*first1),std::invoke(proj2,*first2))){*result=*first1;++first1;}elseif(std::invoke(comp,std::invoke(proj2,*first2),std::invoke(proj1,*first1))){*result=*first2;++first2;}else{*result=*first1;++first1;++first2;}}auto res1=ranges::copy(std::move(first1), std::move(last1), std::move(result));auto res2=ranges::copy(std::move(first2), std::move(last2), std::move(res1.out));return{std::move(res1.in), std::move(res2.in), std::move(res2.out)};} template<ranges::input_range R1,ranges::input_range R2,std::weakly_incrementable O,class Comp=ranges::less,class Proj1=std::identity,class Proj2=std::identity> requiresstd::mergeable<ranges::iterator_t<R1>,ranges::iterator_t<R2>, O, Comp, Proj1, Proj2>constexpr ranges::set_union_result<ranges::borrowed_iterator_t<R1>,ranges::borrowed_iterator_t<R2>, O> operator()(R1&& r1, R2&& r2, O result, Comp comp={}, Proj1 proj1={}, Proj2 proj2={})const{return(*this)(ranges::begin(r1),ranges::end(r1),ranges::begin(r2),ranges::end(r2), std::move(result), std::move(comp), std::move(proj1), std::move(proj2));}}; inlineconstexpr set_union_fn set_union{}; |
#include <algorithm>#include <iostream>#include <iterator>#include <vector> void print(constauto& in1,constauto& in2,auto first,auto last){std::cout<<"{ ";for(constauto& e: in1)std::cout<< e<<' ';std::cout<<"} ∪ { ";for(constauto& e: in2)std::cout<< e<<' ';std::cout<<"} =\n{ ";while(!(first== last))std::cout<<*first++<<' ';std::cout<<"}\n\n";} int main(){std::vector<int> in1, in2, out; in1={1,2,3,4,5}; in2={3,4,5,6,7}; out.resize(in1.size()+ in2.size());constauto ret= std::ranges::set_union(in1, in2, out.begin()); print(in1, in2, out.begin(), ret.out); in1={1,2,3,4,5,5,5}; in2={3,4,5,6,7}; out.clear(); out.reserve(in1.size()+ in2.size()); std::ranges::set_union(in1, in2,std::back_inserter(out)); print(in1, in2, out.cbegin(), out.cend());}
Output:
{ 1 2 3 4 5 } ∪ { 3 4 5 6 7 } ={ 1 2 3 4 5 6 7 } { 1 2 3 4 5 5 5 } ∪ { 3 4 5 6 7 } ={ 1 2 3 4 5 5 5 6 7 }
(C++20) | computes the difference between two sets (algorithm function object)[edit] |
(C++20) | computes the intersection of two sets (algorithm function object)[edit] |
computes the symmetric difference between two sets (algorithm function object)[edit] | |
(C++20) | merges two sorted ranges (algorithm function object)[edit] |
(C++20) | returnstrue if one sequence is a subsequence of another (algorithm function object)[edit] |
computes the union of two sets (function template)[edit] |