用C++ SDK实现动态数组类

        C++ SDK没有直接提供动态数组功能,虽然可以使用MFC的CArray类,或者用指针+new来实现,但前者需要MFC库,后者使用时不易理解且运行效率低,为此,我把很久前自己写的一个简单的动态数组类贴出来,希望给一些朋友启发。

        代码说明:本类在数组成员的赋值和内存分配上作了优化,对大数组的性能有明显提高。

        使用方法:将代码复制到头文件CMyArray.h文件中,在项目中引用该文件即可。

        一、头文件CMyArray.h

#ifndef __TDARRAY_H__
#define __TDARRAY_H__

#include 
#include 

template  
class CMyArray
{
private:
	T *m_pArray; //内存指针
	DWORD m_nItemCount; //成员总数量
	DWORD m_nBlockCount; //内存块数量
	DWORD m_nItemsPerBlock; //每个内存块中包含的成员数量
	DWORD m_dwAllocationGranularity; //内存分配粒度(即内存块大小)
	DWORD ITEM_SIZE;
public:
	CMyArray()
	{
		SYSTEM_INFO si;
		GetSystemInfo(&si);
		m_dwAllocationGranularity = si.dwAllocationGranularity;

		m_nItemCount = 0;
		m_nBlockCount = 0;
		m_pArray = NULL;
		ITEM_SIZE = sizeof(T);
		m_nItemsPerBlock = m_dwAllocationGranularity / ITEM_SIZE;
	};

	~CMyArray()
	{
		if(m_pArray)GlobalFree(m_pArray);
	};

	T* Add(T item)
	{
		return Add(&item);
	};
	T* Add(T *item)
	{
		if(!m_pArray)
		{
			m_pArray = (T*)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, m_dwAllocationGranularity);
			if(!m_pArray)throw _T("内存溢出");
			m_nBlockCount = 1;
		}
		else
		{
			if(m_nItemCount % m_nItemsPerBlock == 0)
			{
				m_nBlockCount ++;
				m_pArray = (T*)GlobalReAlloc(m_pArray, m_nBlockCount * m_dwAllocationGranularity, GMEM_MOVEABLE | GMEM_ZEROINIT);
				if(!m_pArray)throw _T("内存溢出");
			}
		}
		T* p = m_pArray+m_nItemCount;
		if(ITEM_SIZE <= 8)
			*p = *item;
		else
			memcpy(p, item, ITEM_SIZE);
		m_nItemCount++;
		return p;
	};

	BOOL Remove(DWORD position)
	{
		if(position

        二、测试代码:

#include "stdafx.h"
#include  
#include  
#include  
#include "CMyArray.h"

int main(void) 
{ 
	long i;
	//实例化数组类
	CMyArray *pArray = new CMyArray();

	//添加数组成员
	for(i=1; i<100000; i++)
	{
		pArray->Add(i);
	}

	//移出数组成员
	pArray->Remove(99991);

	//获得数组成员个数
	long nCount = pArray->GetCount();

	//显示部分数组成员
	for(i=99990; iGetItemValue(i));
	}

	//销毁数组对象
	delete pArray;

	getchar();

	return 0;
}



你可能感兴趣的:(C/C++,VC,动态数组)