MFC的CArray排序小結(結合std::sort)
阿新 • • 發佈:2019-01-24
MFC的CArray非常好用(相對於C/C++的靜態陣列),但無法根據某個成員排序。下面是結合std::sort一塊實現的CArray排序,廢話少說,直接上程式乾貨:
#include "stdafx.h" #include "Test.h" #include <algorithm> #ifdef _DEBUG #define new DEBUG_NEW #endif // // 自定義的資料結構 // typedef struct { int x; char str[100]; double f; }MY_T; // 唯一的應用程式物件 CWinApp theApp; using namespace std; CArray <MY_T, MY_T&> myArray; unsigned RandUInt32(unsigned int min, unsigned int max) { unsigned u; rand_s(&u); return (unsigned)((double)u / ((__int64)UINT_MAX + 1) * (max - min) + min); } // // 下面是比較函式,三種類型 // bool Comp_f (MY_T &p1, MY_T &p2) { return p1.f > p2.f; } //字串比較 bool Comp_str(MY_T &p1, MY_T &p2) { if(strcmp(p1.str, p2.str) >0) return true; else return false; } //整數比較 bool Comp_i (MY_T &p1, MY_T &p2) { return p1.x > p2.x; } void Print() { printf("整數\t字串\t浮點數\r\n"); for (int i=0; i<myArray.GetSize(); i++) { printf("%d\t%s\t%.3f\r\n", myArray[i].x, myArray[i].str, myArray[i].f); } printf("\r\n"); } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // 初始化 MFC 並在失敗時顯示錯誤 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: 更改錯誤程式碼以符合您的需要 _tprintf(_T("錯誤: MFC 初始化失敗\n")); nRetCode = 1; } else { // // 產生幾個內容, // for (int i=0; i<5; i++) { MY_T a = {0}; a.x = i+1; int x = RandUInt32(1020, 9999); itoa(x, a.str, 10); //隨機的4位字串 a.f = x*RandUInt32(10, 99)*0.145; //隨機的浮點數 myArray.Add(a); } //輸出檢視結果 Print(); //排序,替換最後一個函式指標引數 std::sort(myArray.GetData(), myArray.GetData()+myArray.GetSize(), Comp_f); //再次輸出檢視結果 Print(); } return nRetCode; }
上述程式用到了rand_s,需要將巨集定義放在stdafx.h的最上面:#define _CRT_RAND_S。
還有一點需要注意:比較函式返回的是bool型別,不是整數型別(0或1),因此在比較字串(即使用strcmp)時,要返回true或false型別!!