티스토리 뷰
Item 19: Understand the difference between equality and equivalence
Chaed 2018. 4. 17. 22:10c++에서 stl에 있는 associative container들은 객체나 값을 비교하는데 있어 비교를 이용하여 원하는 값을 찾거나 비교합니다.
associative container에는 set, map이 존재합니다.
여기서 insert, find, erase등의 멤버함수들은 원하는 값을 찾거나 존재여부를 탐색하는데 앞서 언급한바와 같이 비교를 이용합니다.
이때 비교를 위해서 이번장의 주제이기도 한 equailty와 equlvalence를 이해 할 필요가 있습니다.
사실 설명에 앞서 책에서 내용과 달리 현재 std에서는 연관 컨테이너에서 크게 equality를 사용하지 않는것을 보입니다.
우선 더 깊은 설명 이전에 용어 설명을 하면 다음과 같습니다.
equailty = 상등관계
c++에서는 opeator==에 해당하며 두 객체 혹은 값이 일치하는 여부를 의미합니다.
eqaulvence = 동등관계
operator<에 해당하며 두 객체가 서로 앞서거나 뒤서지 않는 상태를 의미합니다.
식으료 표현하면 다음과 같이 표현할 수 있습니다.
객체 a, b가 있을 때,
!(a<b) && !(b<a)이 성립한다면 동등관계가 성립한다.
개념자체는 크게 어렵지 않습니다.
단지 왜 두가지 개념이 사용되느냐 하는점 입니다.
책에서 설명에 따르면,
연관 컨테이너에서 비교를 기본적으로 equalvence를 이용한다면 equality개념을 이용하지 않아도 되는 점때문에
연관 컨테이너에서 기본 comparer는 equalvence를 이용하고 있습니다.
다시 좀 더 풀어서 설명하면 연관컨테이너의 정렬 상태를 유지하기 위해 어떤 개념을 적용할 때 더 이득인가 하는점을
생각해보면 알 수 있습니다.
가령 set<int>을 만들때 별다른 comparer를 지정해주지 않으면 less<int>를 내부적으로 int comparer로 사용합니다.
less는 <를 호출하게끔 구현되어 있습니다
less는 소스상으로 다음과 같이구현되어 있습니다.
(c+11이전에는 binary function으로 구현하는 반면 c++11부터는 constexpr를 사용하는 점도 눈여겨 볼만 합니다.)
insert함수는 위와 같은 비교를 통해 원하는 위치에 객체 혹은 값을 삽입하니다.
하지만 만약 eqauilty를 이용하였다면 어떻게 될까요?
1차적으로 operator==를 호출하게 되며 이것만으론 자신의 위치를 알아 낼 수 없으니 추가로 operator< 까지 필요로 하게 될것입니다.
(만약 단순히 find 함수라면 operator==를 이용하여 존재여부는 알 수 있었을것입니다.
결국 위와 같은 이유로 상등성과 동등성의 개념을 이해할 필요가 있습니다.
글의 초반에서 언급한바와 같이 현재 c++11에서는 상등성을 이용하는 부분은 눈에 띄지 않고 동등성을 이용하는것으로 보입니다.
대표적으로 find가 그렇습니다.
http://ohyecloudy.com/pnotes/archives/341/
위의 링크릴 보신다면 기존 visual studio 2005(c++03으로 추정)에서의 stl은 find에서 equailty를 이용하는것으로 보입니다.
하지만 c++11에서는 equalvence (operaotr< )를 호출하는것으로 변경되었습니다.
insert, erase역시 마찬가지로 operator<를 호출하게끔 구현되어 있습니다.
위 소스와 같이 set을 선언할 때 comparer로 람다함수의 comp를 넣어주면 <연산을 통해 set에서 연산을 수행하게됩니다.
만약 그렇지 않으면 less<Widget>을 이용하게 되고 Widget의 operator<를 이용하게 됩니다.
만약 WIdget의 oerpator<가 오버라이딩 되어있지 않다면 컴파일에러가 나게 됩니다.
'프로그래밍 > C C++' 카테고리의 다른 글
gcc와 msvc에서 range-based for loop(범위 기반 반복문)사용의 주의점. (0) | 2018.05.22 |
---|---|
Item20 : Specify comparsion types for associative conatainers of poniters (0) | 2018.05.13 |
Item 17 : Use "Shrink to fit" to trim excess capacity (0) | 2018.02.24 |
item 16 : Know how to pass vector and string data to legacy APIs. (0) | 2018.01.31 |
item14 : Use reserve to avoid unnecessary reallocations. (0) | 2018.01.24 |
- Total
- Today
- Yesterday
- linux
- compile
- 피아노
- cpp
- C language
- 카카오 공채
- 코드잼
- printf
- 문자열
- Algorithm
- kernerl
- 여행
- regex
- 사천
- peram jam
- Spring
- Pointer
- STL
- link
- Codejam
- 중국여행
- 정규표현식
- yiruma
- 알고리즘
- 중국
- 이루마
- C++
- 악보
- python
- 드럼
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |