서의 공간

집합 연산 본문

C++/stl

집합 연산

홍서의 2025. 2. 25. 16:31

set_difference

template <class _InIt1, class _InIt2, class _OutIt, class _Pr>
_OutIt set_difference(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _InIt2 _Last2, _OutIt _Dest, _Pr _Pred) 
{
    // take set [_First2, _Last2) from [_First1, _Last1)

    // _OutIt의 결과는 무엇인가?

    // 두 입력 집합의 범위 체크
    _Adl_verify_range(_First1, _Last1);
    _Adl_verify_range(_First2, _Last2);

    // 반복자를 언랩하여 원시 포인터로 변환. 성능 최적화
    auto _UFirst1 = _Get_unwrapped(_First1);
    const auto _ULast1 = _Get_unwrapped(_Last1);
    auto _UFirst2 = _Get_unwrapped(_First2);
    const auto _ULast2 = _Get_unwrapped(_Last2);

    // 입력 집합의 순서를 검사.(정렬되어있는지 확인)
    _DEBUG_ORDER_SET_UNWRAPPED(_InIt2, _UFirst1, _ULast1, _Pred);
    _DEBUG_ORDER_SET_UNWRAPPED(_InIt1, _UFirst2, _ULast2, _Pred);

    // 출력 집합의 반복자를 언랩하여 원시 포인터로 변환.
    auto _UDest = _Get_unwrapped_unverified(_Dest);

    // 처음 집합의 끝이 아니고 두 번째 집합의 끝이 아닐 때까지 반복
    // 종료 조건: 두 집합 중 하나라도 끝에 도달했을 때
    // 종료 조건 이유: 두 집합이 정렬되어 있기 때문에 두 집합 중 하나라도 끝에 도달했다면,
    // 나머지 집합의 원소는 더 이상 비교할 필요가 없다.
    while (_UFirst1 != _ULast1 && _UFirst2 != _ULast2) {
        // 이 매크로는 디버그 모드에서 pred(a, b)를 평가한다. 디버그 모드가 아닐 때도 동일한 비교를 수행.
        // pred의 디폴트는 less<>{}이다. *_UFirst1 < *_UFirst2를 평가한다.
        if (_DEBUG_LT_PRED(_Pred, *_UFirst1, *_UFirst2)) { // copy first
            // 차집합의 마지막 it이 될 _UDest에 차집합의 첫 번째 원소가될 *_UFirst1을 대입한다.
            *_UDest = *_UFirst1;
            ++_UDest; // 다음 위치
            ++_UFirst1; // 다음 원소
        }
        // *_UFirst1 >= *_UFirst2 일 때
        else {
            // *_UFirst2 >= *_UFirst1일 때, 해당 조건을 만족하는 경우는 *_UFirst1 == *_UFirst2인 경우뿐이다.
            if (!_Pred(*_UFirst2, *_UFirst1)) {
                ++_UFirst1;
            }

            ++_UFirst2;
        }
    }

    _Seek_wrapped(_Dest, _STD _Copy_unchecked(_UFirst1, _ULast1, _UDest));
    return _Dest;
}

'C++ > stl' 카테고리의 다른 글

<algorithm> next_permutation, prev_permutation  (0) 2021.05.11
<algorithm> is_heap()  (0) 2021.03.10
<algorithm> std::generate_n()  (0) 2021.02.03
<algorithm> std::find(), std::unique()  (0) 2020.12.31
<algorithm> mismatch  (0) 2020.12.29
Comments