Click to See Complete Forum and Search --> : MFC STL: How can I sort a 'CArray' (or 'CStringArray', 'CIntArray', etc.)?


Gabriel Fleseriu
February 14th, 2003, 10:36 AM
Q: How can I sort a 'CArray' (or 'CStringArray', 'CIntArray', etc.)?

A: If the CxxxArray's items can be compared, then use 'std::sort':

Ascending:


#include <algorithm>

CArray<int, int&> MyCArray;
CStringArray MyStringArray;

// Sort the CArray of ints</span>
std::sort(MyCArray.GetData(), MyCArray.GetData() + MyCArray.GetSize());

// Sort the CStringArray
std::sort(MyStringArray.GetData(), MyStringArray.GetData() + MyStringArray.GetSize());


Descending:

You need to supply a comparison function.


#include &lt;algorithm&gt;

bool SortDescendingInt(const int&amp; x, const int&amp; y)
{
return x &gt; y;
}

bool SortDescendingString(const CString&amp; s1,
const CString&amp; s2)
{
return s1 &gt; s2;
}

CArray&lt;int, int&gt; MyCArray;
CStringArray MyStringArray;

// Sort the CArray of ints
std::sort(MyCArray.GetData(),
MyCArray.GetData() + MyCArray.GetSize(),
SortDescendingInt);

// Sort the CStringArray
std::sort(MyStringArray.GetData(),
MyStringArray.GetData() + MyStringArray.GetSize(),
SortDescendingString);


FAQ contributed by: [Paul McKenzie (http://www.codeguru.com/forum/member.php?u=1549)]
<br><br>

ovidiucucu
July 3rd, 2008, 08:39 AM
One alternative solution is to use the ANSI C function qsort (http://msdn.microsoft.com/en-us/library/zes7xw0h(VS.80).aspx)

Next example sorts ascending, non case-sensitive the elements of a CStringArray.
CStringArray arr;

arr.Add(_T("barbu")); // just for example
arr.Add(_T("ANNA"));
arr.Add(_T("ZOE"));
arr.Add(_T("BUBU"));
arr.Add(_T("bob"));
arr.Add(_T("MIKI"));
// ...

qsort(arr.GetData(), arr.GetSize(), sizeof(CString*), CompareAscNoCase);
int CompareAscNoCase(const void* left, const void* right)
{
return ((CString*)left)->CompareNoCase(*((CString*)right));
}