C, C++ 문법

c의 qsort와 stl의 sort에서 비교 함수(또는 함수객체) 사용시 결과값 세팅 주의

디버그정 2012. 10. 22. 18:39

오름차순 정렬하면 앞에는 작은 것, 뒤에는 큰 게 온다. 갈수록 오른다고 생각하면 된다.

ex) 0, 1, 7, 31, 55, 77, 999

     김연아, 네이버, 다음, 라이코스, 마라도나, 메시, 박지성, 사오정, 애플, 잡스, 차범근, 카카, 태연, 펠레, 호날두, 홍명보

 

1. c qsort에서 비교함수 사용시 오름차순 정렬

int Compare(const void *a, const void *b)

{

return _tcsicmp(((PERSON *)a)->szName, ((PERSON *)b)->szName);

}

qsort(pPerson, count, sizeof(PERSON), Compare);

참고로 포인터의 연산자 순위가 형변환보다 높다. 위에서 형변환 먼저 처리하려면 필히 괄호를 써줘야 된다.

 

2. stl sort에서 함수객체 사용시 오름차순 정렬

   (비교함수로도 구성 가능하다. bool Compare(PERSON a, PERSON b) 형식으로 구성하면 된다. 내용은 아래처럼 넣어주면 된다.)

struct Compare

{

bool operator()(PERSON& a, PERSON& b)
{
     return _tcsicmp(a.szName, b.szName) < 0;

      }

}

sort(vp.begin(), vp.end(), Compare());

 

 

c 표준함수 qsort에서는 오름차순 정렬시 첫번째 인수가 두번째 인수보다 크면 양수를 리턴해야 한다.

작으면 음수를 리턴하면 된다. 따라서 문자열 비교시 그대로 _tcsicmp의 결과값을 사용할 수 있다.

 

이와는 다르게 stl sort에서는 일단 비교 함수(객체)의 결과값은 0 아니면 1을 리턴해야 한다.(bool형 리턴)

오름차순 정렬시 첫번째 인수가 두번째 인수보다 더 크면 양수 1이 아닌 0을 리턴해야 한다.

첫번째 인수가 두번째 인수보다 작을 때 양수 1을 리턴시킨다. 위의 c 표준함수 qsort의 상황과는 좀 반대되는 상황이다.

그래서 _tcsicmp의 결과값에 < 0 관계연산을 필히 해줘야 한다.