Constructs a sorted range beginning at result consisting of elements that are found in both sorted input ranges [first1, last1) and [first2, last2). If some element is found m times in [first1, last1) and n times in [first2, last2), the first min(m,n) elements will be copied from the first range to result. The order of equivalent elements is preserved.
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
(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_intersection_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_intersection_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)))++first1;elseif(std::invoke(comp,std::invoke(proj2,*first2),std::invoke(proj1,*first1)))++first2;else*result=*first1,++first1,++first2,++result;}return{ranges::next(std::move(first1),std::move(last1)),ranges::next(std::move(first2),std::move(last2)),std::move(result)};}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_intersection_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_intersection_fnset_intersection{};Run this code
#include<algorithm>#include<iostream>#include<iterator>#include<vector>voidprint(constauto&v,constauto&rem){std::cout<<"{ ";for(constauto&e:v)std::cout<<e<<' ';std::cout<<'}'<<rem;}intmain(){constautoin1={1,2,2,3,4,5,6};constautoin2={2,2,3,3,5,7};std::vector<int>out{};std::ranges::set_intersection(in1,in2,std::back_inserter(out));print(in1," ∩ "),print(in2," = "),print(out,"\n");}Output:
{ 1 2 2 3 4 5 6 } ∩ { 2 2 3 3 5 7 } = { 2 2 3 5 }