QSort for CStringArray
Posted
by Chris Losinger
on April 3rd, 1999
These three routines can be used to perform a qsort on a CStringArray. It is a fairly simple hack, but still a hack. It sure is fast, though.
// first, declare these somewhere
void SortStringArray (CStringArray& ar, BOOL bDescending);
int CompareDescending(const void *a, const void *b);
int CompareAscending(const void *a, const void *b);
// put something in your CString array
CStringArray bob;
bob.Add("Are");
bob.Add("You");
bob.Add("Talking");
bob.Add("To");
bob.Add("Me?");
// sort it
SortStringArray(bob, TRUE);
// here's the code!
//////////////////////////////////////////////////////////////////////////
int CompareAscending(const void *a, const void *b)
{
CString *pA = (CString*)a;
CString *pB = (CString*)b;
return (pA->Compare(*pB));
}
//////////////////////////////////////////////////////////////////////////
int CompareDescending(const void *a, const void *b)
{
CString *pA = (CString*)a;
CString *pB = (CString*)b;
return (-1 * (pA->Compare(*pB)));
}
//////////////////////////////////////////////////////////////////////////
void SortStringArray (CStringArray& csa, BOOL bDescending)
{
int iArraySize = csa.GetSize();
if (iArraySize <= 0)
return;
int iCSSize = sizeof (CString*);
void* pArrayStart = (void *)&csa[0];
if (bDescending)
qsort (pArrayStart, iArraySize, iCSSize, CompareDescending);
else
qsort (pArrayStart, iArraySize, iCSSize, CompareAscending);
}

Comments
Case sensitivity added...
Posted by Legacy on 01/26/2000 12:00amOriginally posted by: Troels
//////////////////////////////////////////////////////////////////////////
inline int StringArray_Compare(const void* a, const void* b, BOOL bCaseSensitive)
{
LPCTSTR pA = ((CString*)a)->operator LPCTSTR();
LPCTSTR pB = ((CString*)b)->operator LPCTSTR();
return bCaseSensitive ? _tcscmp(pA, pB) : _tcsicmp(pA, pB);
}
static int __cdecl StringArray_CompareAscending (const void* a, const void* b)
{
return StringArray_Compare(a, b, FALSE);
}
static int __cdecl StringArray_CompareDescending (const void* a, const void* b)
{
return StringArray_Compare(a, b, FALSE) * -1;
}
static int __cdecl StringArray_CompareAscending_Case (const void* a, const void* b)
{
return StringArray_Compare(a, b, TRUE);
}
static int __cdecl StringArray_CompareDescending_Case(const void* a, const void* b)
{
return StringArray_Compare(a, b, TRUE) * -1;
}
//////////////////////////////////////////////////////////////////////////
int StringArray_Sort(CStringArray* pas, BOOL bCaseSensitive, BOOL bAscending)
{
const int count = pas->GetSize();
qsort(pas->GetData(), count, sizeof(CString*),
bAscending ? (bCaseSensitive ? StringArray_CompareAscending_Case : StringArray_CompareAscending )
: (bCaseSensitive ? StringArray_CompareDescending_Case : StringArray_CompareDescending));
return count;
}
//////////////////////////////////////////////////////////////////////////
Reply1. Case insensitive sorting and 2. missing parameter error is not an error
Posted by Legacy on 07/27/1999 12:00amOriginally posted by: Will Mainwaring
ReplyCompare function is missing parameters
Posted by Legacy on 07/07/1999 12:00amOriginally posted by: Tim Hodgson
Ex: qsort (pArrayStart, iArraySize, iCSSize, CompareDescending);
CompareDescending is missing parameters to make this code work.
Anyone know what should go there?
Reply