Я согласен, что это выглядит совершенно разбитым.Для сравнения вот код STLport:
template <class _InputIter1, class _InputIter2, class _OutputIter,
class _Compare>
_OutputIter __set_union(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_OutputIter __result, _Compare __comp) {
_STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1))
_STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first2, __last2))
while (__first1 != __last1 && __first2 != __last2) {
if (__comp(*__first1, *__first2)) {
_STLP_VERBOSE_ASSERT(!__comp(*__first2, *__first1), _StlMsg_INVALID_STRICT_WEAK_PREDICATE)
*__result = *__first1;
++__first1;
}
else if (__comp(*__first2, *__first1)) {
_STLP_VERBOSE_ASSERT(!__comp(*__first1, *__first2), _StlMsg_INVALID_STRICT_WEAK_PREDICATE)
*__result = *__first2;
++__first2;
}
else {
*__result = *__first1;
++__first1;
++__first2;
}
++__result;
}
return _STLP_STD::copy(__first2, __last2, _STLP_STD::copy(__first1, __last1, __result));
}