STL의 <algorithm> 에 들어있는 lexicographical_compare 라는 함수가 있다.
그런데 lexicographical이 뭐지?
lexicographical의 사전적 의미는 '사전 편찬의' 이다.
그러면 lexicographical order 는 '사전에 편찬되는 순서' 일 것이다.
사전에서 'childern' 이라는 단어를 찾고 있다고 생각해보자.
일단 우리는 c로 시작하는 섹션으로 갈 것이다.
그리고 그 다음 글자부터 한글자 한글자씩... ca, cb, cc... ch가 나올 때 까지 밑으로 훑어 내려 간다.
그렇다면 'chill' 이라는 단어는 children을 찾기 전에 나타날까, 아니면 찾은 후에 더 아래에 위치하고 있을까?
c.h..i..l.... a.. b.. c.. d! 섹션에서 children이라는 단어가 나타날 것이다. chil 'l' 은 더 뒤에 있게 된다.
말인 즉슨, 'childern' 'chill' 두 단어를 비교했을 때 'children' 이 8글자로 더 길지만 'chill'이라는 5글자 짜리 단어가 더 '큰' 단어가 된다는 말이다.
즉 lexicographical_compare는 '이 순서' 대로 요소를 비교 한다는 뜻이 된다.
lexicohraphical_compare 는 첫번째 요소가 두번째 요소 보다 'lexicographically less' 하면 true를 반환한다.
혹은 두 요소가 같은 경우를 포함 해서 두번째 요소가 더 작다면 false를 반환 한다.
그럼 lexicographical_compare('children', 'chill')(편의상 이렇게 표현함) 는 무엇을 반환할까? true를 반환하게 되는 것이다.
이것은 첫번째 타입이고, 'less' 말고 다른 비교 연산을 인자로 줄 수 있는 두번째 타입도 있다.
첫번째 타입의 구현 방식은 다음과 같다.
template <class InputIterator1, class InputIterator2>
bool lexicographical_compare (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2)
{
while (first1!=last1)
{
if (first2==last2 || *first2<*first1) return false;
else if (*first1<*first2) return true;
++first1; ++first2;
}
return (first2!=last2);
}
InputIterator1의 처음과 끝, InputIterator2의 처음과 끝을 인자로 받는다.
first1, first2를 순회하는 이터레이터로 사용한다.
while (첫번째 요소의 끝에 도달할 때까지)
{
if ( 두번째 요소의 끝에 도달 했거나, 현재 위치의 두번째 요소 값이 첫번째 요소 값 보다 작으면) return false;
else if (첫번째 요소의 값이 두번째 요소의 값 보다 작으면) return true;
위 두개가 아니면 두 요소의 크기는 같으므로 다음 비교를 위해 요소의 위치를 한칸씩 ++ 해준다.
}
첫번째 요소의 끝에 도달할 때까지 리턴이 되지 않았다면 두 요소의 각 위치의 값이 계속 똑같았다는 말이 된다.
그러면 두번째 요소가 만약 끝에 도달 하지 않았다면 두번째 요소가 더 크다는 것이 되므로 true를 반환 하게 될 것이다.
혹은 두번째 요소도 끝에 도달 했다면 처음부터 끝까지 똑같은 요소밖에 없었으니 두 요소가 같다는 것이 되므로 false를 반환 하게 된다.
위 세줄이 return (first2 != last2) 를 풀어 쓴 것이다.
비교 함수를 인자로 받는 두번째 타입은 단순히 비교 하는 연산자를 함수로 대체해 주면 될 것이다.
'C++' 카테고리의 다른 글
[vector container] operator[] vs at (0) | 2022.09.14 |
---|---|
[C++] const vs constexpr (0) | 2022.09.01 |
[C++] this 는 NULL인 경우가 있는가? (0) | 2022.07.19 |
[C++] 클래스 동적 배열 초기화 (0) | 2022.07.19 |
[C++] 인스턴스화 (instantiate) 란? (0) | 2022.07.16 |