std::ranges::set_symmetric_difference, std::ranges::set_symmetric_difference_result - cppreference.com

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 at result. The resulting range is also sorted.

If some element is found m times in [first1, last1) and n times in [first2, last2), it will be copied to result exactly │m - n│ times. If m > n, then the last m - n of those elements are copied from [first1, last1), otherwise the last n - m elements are copied from [first2, last2). The resulting range cannot overlap with either of the input ranges.

1) Elements are compared using the given binary comparison function comp.

2) Same as (1), but uses r1 as the first range and r2 as the second range, as if using ranges::begin(r1) as first1, ranges::end(r1) as last1, ranges::begin(r2) as first2, and ranges::end(r2) as last2.

The function-like entities described on this page are

algorithm function objects

(informally known as niebloids), that is:

{last1,last2,result_last}, where result_last is the end of the constructed range.

At most 2·(N1+N2)-1 comparisons and applications of each projection, where N1 and N2 are ranges::distance(first1,last1) and ranges::distance(first2,last2), respectively.

structset_symmetric_difference_fn{template<std::input_iteratorI1,std::sentinel_for<I1>S1,std::input_iteratorI2,std::sentinel_for<I2>S2,std::weakly_incrementableO,classComp=ranges::less,classProj1=std::identity,classProj2=std::identity>requiresstd::mergeable<I1,I2,O,Comp,Proj1,Proj2>constexprranges::set_symmetric_difference_result<I1,I2,O>operator()(I1first1,S1last1,I2first2,S2last2,Oresult,Compcomp={},Proj1proj1={},Proj2proj2={})const{while(!(first1==last1orfirst2==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;}}autores1{ranges::copy(std::move(first1),std::move(last1),std::move(result))};autores2{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_rangeR1,ranges::input_rangeR2,std::weakly_incrementableO,classComp=ranges::less,classProj1=std::identity,classProj2=std::identity>requiresstd::mergeable<ranges::iterator_t<R1>,ranges::iterator_t<R2>,O,Comp,Proj1,Proj2>constexprranges::set_symmetric_difference_result<ranges::borrowed_iterator_t<R1>,ranges::borrowed_iterator_t<R2>,O>operator()(R1&&r1,R2&&r2,Oresult,Compcomp={},Proj1proj1={},Proj2proj2={})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));}};inlineconstexprset_symmetric_difference_fnset_symmetric_difference{};Run this code

#include<algorithm>#include<iostream>#include<iterator>#include<vector>voidvisualize_this(constauto&v,intmin=1,intmax=9){for(autoi{min};i<=max;++i){std::ranges::binary_search(v,i)?std::cout<<i:std::cout<<'.';std::cout<<' ';}std::cout<<'\n';}intmain(){constautoin1={1,3,4,6,7,9};constautoin2={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 . 9 1 . . 4 5 6 . . 9 . . 3 . 5 . 7 . .