```
template<class InputIterator1, class InputIterator2,
class OutputIterator>
OutputIterator
set_intersection(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
class ForwardIterator>
ForwardIterator
set_intersection(ExecutionPolicy&& exec,
ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2,
ForwardIterator result);
template<class InputIterator1, class InputIterator2,
class OutputIterator, class Compare>
OutputIterator
set_intersection(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result, Compare comp);
template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
class ForwardIterator, class Compare>
ForwardIterator
set_intersection(ExecutionPolicy&& exec,
ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2,
ForwardIterator result, Compare comp);
```

Requires:
The resulting range shall not overlap with either of the original ranges

. Effects:
Constructs a sorted intersection of the elements from the two ranges;
that is, the set of elements that are present in both of the ranges

. Returns:
The end of the constructed range

. Complexity:
At most

2 * ((last1 - first1) + (last2 - first2)) - 1
comparisons

. Remarks: If

[first1, last1) contains

m elements that are equivalent to
each other and

[first2, last2) contains

n elements that are equivalent
to them, the first

min(m,n) elements shall be copied from the first range
to the output range, in order

.