kyuseo의 게임 프로그래밍

QSortCArray :: CArray 를 qsort 함수로 정렬하기 본문

C++ 개발

QSortCArray :: CArray 를 qsort 함수로 정렬하기

kyuseo 2008. 1. 3. 19:55

개요..

 

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 );

    }

}