1. 程式人生 > >MFC的CArray排序小結(結合std::sort)

MFC的CArray排序小結(結合std::sort)

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型別!!