4

该站点声称set_union等效于以下代码:

template <class InputIterator1, class InputIterator2, class OutputIterator>
  OutputIterator set_union ( InputIterator1 first1, InputIterator1 last1,
                             InputIterator2 first2, InputIterator2 last2,
                             OutputIterator result )
{
  while (true)
  {
    if (*first1<*first2) *result++ = *first1++;
    else if (*first2<*first1) *result++ = *first2++;
    else { *result++ = *first1++; first2++; }

    if (first1==last1) return copy(first2,last2,result);
    if (first2==last2) return copy(first1,last1,result);
  }
}

但这似乎很奇怪:如果其中一个范围为空,那不会崩溃(或导致其他未定义的行为)吗?这两个if子句不应该在循环的开头while,而不是结尾吗?

4

1 回答 1

4

我同意它看起来完全坏了。为了比较,这里是 STLport 代码:

模板<类_InputIter1,类_InputIter2,类_OutputIter,
          类_比较>
_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))
  而 (__first1 != __last1 && __first2 != __last2) {
    if (__comp(*__first1, *__first2)) {
      _STLP_VERBOSE_ASSERT(!__comp(*__first2, *__first1), _StlMsg_INVALID_STRICT_WEAK_PREDICATE)
      *__result = *__first1;
      ++__first1;
    }
    否则 if (__comp(*__first2, *__first1)) {
      _STLP_VERBOSE_ASSERT(!__comp(*__first1, *__first2), _StlMsg_INVALID_STRICT_WEAK_PREDICATE)
      *__result = *__first2;
      ++__first2;
    }
    别的 {
      *__result = *__first1;
      ++__first1;
      ++__first2;
    }
    ++__结果;
  }
  返回 _STLP_STD::copy(__first2, __last2, _STLP_STD::copy(__first1, __last1, __result));
}
于 2010-11-30T20:49:26.710 回答