서의 공간
집합 연산 본문
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