2010-11-30 2 views
4

set_unionset_union은 다음 코드와 동일하다고 주장합니다.올바른 std :: 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); 
    } 
} 

그러나 이상하게 보입니다. 범위 중 하나가 비어 있으면 충돌이 발생하지 않거나 다른 정의되지 않은 동작이 발생하지 않습니까? 2 개의 if 절이 while 루프의 시작 부분에 있지 않아야합니까?

+4

cplusplus.com은 신뢰할 수있는 참조가 아닙니다. ISO/IEC 14882는'set_union'을위한 샘플 코드를 포함하지 않으며, 단지 입력 시퀀스를 비울 수있는 명세이다. –

+0

실제로 저는 cplusplus.com을 좋아하지 않았습니다. 세부 사항에는 정확하지 않습니다. – ybungalobill

+0

@ybungalobill : 인덱스처럼 좋네요 :) –

답변

4

나는 완전히 부서져 보이는 데 동의합니다. 비교를 위해 다음은 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)); 
} 
관련 문제