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_symmetric_difference_result=ranges::in_in_out_result<I1, I2, O>; | (3) | (since C++20) |
Computes symmetric difference of two sorted ranges: the elements that are found in either of the ranges, but not in both of them are copied to the range beginning atresult. The resulting range is also sorted.
If some element is foundm
times in[
first1,
last1)
andn
times in[
first2,
last2)
, it will be copied toresult exactly│m - n│
times. Ifm > n
, then the lastm - n
of those elements are copied from[
first1,
last1)
, otherwise the lastn - m
elements are copied from[
first2,
last2)
. The resulting range cannot overlap with either of the input ranges.
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 sorted input range |
r2 | - | the second sorted input 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.
struct set_symmetric_difference_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_symmetric_difference_result<I1, I2, O> operator()(I1 first1, S1 last1, I2 first2, S2 last2, O result, Comp comp={}, Proj1 proj1={}, Proj2 proj2={})const{while(!(first1== last1 or first2== last2)){if(std::invoke(comp,std::invoke(proj1,*first1),std::invoke(proj2,*first2))){*result=*first1;++first1;++result;}elseif(std::invoke(comp,std::invoke(proj2,*first2),std::invoke(proj1,*first1))){*result=*first2;++first2;++result;}else{++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_symmetric_difference_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_symmetric_difference_fn set_symmetric_difference{}; |
#include <algorithm>#include <iostream>#include <iterator>#include <vector> void visualize_this(constauto& v,int min=1,int max=9){for(auto i{min}; i<= max;++i){ std::ranges::binary_search(v, i)?std::cout<< i:std::cout<<'.';std::cout<<' ';}std::cout<<'\n';} int main(){constauto in1={1,3,4,6,7,9};constauto in2={1,4,5,6,9}; std::vector<int> out{}; std::ranges::set_symmetric_difference(in1, in2,std::back_inserter(out)); visualize_this(in1); visualize_this(in2); visualize_this(out);}
Output:
1 . 3 4 . 6 7 . 91 . . 4 5 6 . . 9. . 3 . 5 . 7 . .
(C++20) | computes the union of two sets (algorithm function object)[edit] |
(C++20) | computes the difference between two sets (algorithm function object)[edit] |
(C++20) | computes the intersection of two sets (algorithm function object)[edit] |
(C++20) | returnstrue if one sequence is a subsequence of another (algorithm function object)[edit] |
computes the symmetric difference between two sets (function template)[edit] |