왜“b <a? “a <b? b : a”max 템플릿을 구현 하시겠습니까?
C ++ 템플릿-전체 안내서, 2 판 에서는 최대 템플릿을 소개합니다 .
template<typename T>
T max (T a, T b)
{
// if b < a then yield a else yield b
return b < a ? a : b;
}
그리고 “b < a ? a : b”
대신 다음을 사용하여 설명합니다 “a < b ? b : a”
.
[StepanovNotes]에 따른 max () 템플릿은 의도적으로“b <a? “a <b? b : a”를 사용하여 두 값이 같지만 같지 않더라도 함수가 올바르게 작동하는지 확인하십시오.
" even if the two values are equivalent but not equal.
" 를 이해하는 방법 ? “a < b ? b : a”
나에게 동일한 결과가있는 것 같습니다.
std::max(a, b)
실제로 a
는 둘이 동일 할 때 리턴하도록 지정됩니다 .
즉의 실수로 간주 Stepanov 가 제공하는 유용한 속성을 나누기 때문에 다른 사람 a
과 b
당신은 항상 종류를 함께 할 수 있습니다 {min(a, b), max(a, b)}
; 이를 위해 인수가 동일한 경우 max(a, b)
반환 하려고 합니다 b
.
이 답변은 주어진 코드가 C ++ 표준 관점에서 잘못된 이유를 설명하지만 상황에 맞지 않습니다.
상황에 대한 설명은 @TC 의 답변 을 참조하십시오 .
표준은 std::max(a, b)
다음과 같이 정의 합니다 [alg.min.max] (강조는 내 것입니다) :
template<class T> constexpr const T& max(const T& a, const T& b);
요구 사항 : 유형 T가 LessThanComparable (표 18)입니다.
결과 : 더 큰 값.
비고 : 인수가 동일한 경우 첫 번째 인수를 반환합니다.
여기서 동등한 !(a < b) && !(b < a)
것은 true
[alg.sorting # 7] 입니다.
특히 경우 a
와 b
동등한 양 a < b
하고 b < a
있는 false
우측의 값이되도록 :
하므로, 조건 연산자에 반환한다 a
그래서, 오른쪽에 있어야한다 :
a < b ? b : a
... 정답 인 것 같습니다. 이것은 libstdc ++ 및 libc ++에서 사용하는 버전 입니다.
따라서 인용문의 정보는 현재 표준에 따라 잘못된 것처럼 보이지만 정의 된 컨텍스트가 다를 수 있습니다.
요점은 동등 할 때 어떤 것이 반환되어야 하는가이다. 이 경우에는 첫 번째 인수 std::max
를 반환 a
해야합니다.
같으면를 반환합니다
a
.
따라서 a < b ? b : a
사용해야합니다. 반면에 잘못 b < a ? a : b;
반환 b
됩니다.
(@Holt가 말했듯이 인용문은 정반대로 보입니다.)
"두 값은 같지만 같지 않다"는 의미는 비교할 때 동일한 값을 갖지만 다른 측면에서는 다른 객체 일 수 있습니다.
예 :
struct X { int a; int b; };
bool operator< (X lhs, X rhs) { return lhs.a < rhs.a; }
X x1 {0, 1};
X x2 {0, 2};
auto x3 = std::max(x1, x2); // it's guaranteed that an X which cantains {0, 1} is returned
참고 URL : https://stackoverflow.com/questions/50834117/why-use-baab-instead-of-abba-to-implement-max-template
'programing tip' 카테고리의 다른 글
java.sql.PreparedStatement에서 쿼리 가져 오기 (0) | 2020.06.08 |
---|---|
Python을 사용하여 SQLite에 행을 삽입 한 후 삽입 된 ID를 검색하는 방법은 무엇입니까? (0) | 2020.06.08 |
VBA에서 동시에 변수를 선언하고 할당 할 수 있습니까? (0) | 2020.06.08 |
pip install : 해당 디렉토리의 권한과 소유자를 확인하십시오 (0) | 2020.06.08 |
이 JavaScript / jQuery 구문은 어떻게 작동합니까 : (function (window, undefined) {}) (window)? (0) | 2020.06.08 |