QSort for CStringArray

WEBINAR: On-demand webcast

How to Boost Database Development Productivity on Linux, Docker, and Kubernetes with Microsoft SQL Server 2017 REGISTER >

Environment: Tested on VC5

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:00am

    Originally 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;
    }
    //////////////////////////////////////////////////////////////////////////

    Reply
  • 1. Case insensitive sorting and 2. missing parameter error is not an error

    Posted by Legacy on 07/27/1999 12:00am

    Originally posted by: Will Mainwaring

    1.
    
    To sort the array without case considerstions, replace
    "pA->Compare(*pB)" with
    "pA->CompareNoCase(*pB)"

    2.
    The Compare function is not missing parameters, as it is a function pointer. qsort uses elements of the array passed in as void parameters to the Compare...() function.

    The error that this guy has reported is probably due to declaring the 3 functions in his class definition:
    void CMyClass::SortStringArray(...)
    As they are C functions, not C++ functions, you must use:
    void SortStringArray(...)
    Check the help in VC on the "__cdecl" keyword for C -> C++ compatibility.

    Reply
  • Compare function is missing parameters

    Posted by Legacy on 07/07/1999 12:00am

    Originally 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
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • The software-defined data center (SDDC) and new trends in cloud and virtualization bring increased agility, automation, and intelligent services and management to all areas of the data center. Businesses can now more easily manage the entire lifecycle of their applications and services via the SDDC. This Aberdeen analyst report examines how a strong foundation in both the cloud and internal data centers is empowering organizations to fully leverage their IT infrastructure and is also preparing them to be able …

  • On-demand webcast Lately it seems that everywhere you turn, there's another cybersecurity breach — and hackers and thieves are never satisfied with the status quo, continuing to refine their tactics or create new methods of attack. So how do you protect your business now, but also plan for your future security needs? How can you guard against this ever-changing threat landscape? Watch Jeremy Smolik, Systems Engineer at Kaspersky Lab North America, in this on-demand webinar as we explore the biggest …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date