kyuseo의 게임 프로그래밍
QSortCArray :: CArray 를 qsort 함수로 정렬하기 본문
개요.. |
MFC 자료구조용 템플릿 클래스인 CArray는 정렬에서 불편함을 느끼게 됩니다. C++ 표준 함수인 qsort 함수를 이용하기도 어렵고, 자체로는 알고리즘은 제공되지 않으니 qsort 함수와 CArray클래스를 활용하여 하나의 함수로 정렬을 구현을 해 보았습니다. ( STL 의 vector과 같이 쉽게 정렬할 수 있으면 좋으련만…)
코드 |
다음은 CArray 를 qsort 함수를 이용하여 쉽게 정렬하는 템플릿입니다.
#include "afxtempl.h"
// CArray 정렬템플릿함수 template<class T> void QSortCArray( T& t, int (__cdecl *compare )(const void *elem1, const void *elem2 ) ) { if( t.GetSize() <= 0 ) return;
qsort( t.GetData(), t.GetSize(), sizeof( t[0] ), compare ); }
// int 자료형비교함수 int CompareInt( const void *elem1, const void *elem2 ) { int* p1 = (int*) elem1; int* p2 = (int*) elem2;
if( *p1 > *p2 ) return +1; if( *p1 < *p2 ) return -1;
return 0; }
// CPoint 자료형비교함수 int ComparePoint( const void *elem1, const void *elem2 ) { CPoint* p1 = (CPoint*) elem1; CPoint* p2 = (CPoint*) elem2;
if( p1->x > p2->x ) return +1; if( p1->x < p2->x ) return -1;
return 0; }
// qsort 시험 void test_qsort_carray() { // int 자료형정렬테스트 CArray< int, int > a;
a.Add( 9 ); a.Add( 1 ); a.Add( 3 ); a.Add( 6 ); a.Add( 8 );
QSortCArray( a, CompareInt );
for( int i=0; i<a.GetSize(); i++ ) { TRACE( "%s:%d Value1 = %d \n", __FILE__, __LINE__, a[i] ); }
// CPoint 자료형정렬테스트 CArray< CPoint, CPoint > b;
b.Add( CPoint( 4, 6 ) ); b.Add( CPoint( 3, 5 ) ); b.Add( CPoint( 7, 7 ) ); b.Add( CPoint( 1, 8 ) ); b.Add( CPoint( 9, 2 ) );
QSortCArray( b, ComparePoint );
for( i=0; i<b.GetSize(); i++ ) { TRACE( "%s:%d Value1 = (%d,%d) \n", __FILE__, __LINE__, b[i].x, b[i].y ); } } |