DXUT11框架浅析(8)--CGrowableArray
来源:互联网 发布:游戏录制视频软件 编辑:程序博客网 时间:2024/04/29 21:51
DXUT11框架浅析(8)--CGrowableArray
CGrowableArray是一个模板类,实现了类似std::vector的数据结构。是一个基本数组,数据按顺序的依次存放。
1. 类的定义
template<typename TYPE> class CGrowableArray{public:// 构造和销毁一个数组CGrowableArray() { m_pData= NULL; m_nSize= 0; m_nMaxSize = 0; }CGrowableArray(const CGrowableArray<TYPE>& a) { for( int i=0; i < a.m_nSize; i++ ) Add( a.m_pData[i] ); }CGrowableArray& operator = ( constCGrowableArray<TYPE>&a ){ if( this == &a ) return *this; RemoveAll(); for( int i=0; i < a.m_nSize; i++ ) Add( a.m_pData[i] ); return *this; }~CGrowableArray(){ RemoveAll(); } // 为数组增加元素HRESULT Add( const TYPE& value);HRESULT Insert( int nIndex, const TYPE& value);HRESULT SetAt( int nIndex, const TYPE& value); // 元素的个数HRESULT SetSize( intnNewMaxSize );int GetSize()const { return m_nSize; } // 读取元素的值const TYPE& operator[](int nIndex )const { return GetAt( nIndex); }TYPE& operator[]( intnIndex ) { returnGetAt( nIndex); }TYPE& GetAt( int nIndex ) const { assert( nIndex >= 0 && nIndex< m_nSize ); returnm_pData[nIndex];}TYPE* GetData(){ return m_pData;} // 搜索元素int IndexOf(const TYPE&value ) { return( m_nSize > 0 ) ? IndexOf( value, 0, m_nSize ) : -1; }int IndexOf(const TYPE&value, int iStart ) { return IndexOf( value,iStart, m_nSize- iStart ); }int IndexOf(const TYPE&value, int nIndex, int nNumElements ); int LastIndexOf(const TYPE&value ) { return( m_nSize > 0 ) ? LastIndexOf( value, m_nSize-1, m_nSize) : -1; }int LastIndexOf(const TYPE&value, int nIndex ) { return LastIndexOf( value,nIndex, nIndex+1); }int LastIndexOf( constTYPE& value,int nIndex, int nNumElements);bool Contains(const TYPE&value ){ return( -1 != IndexOf( value) ); } // 清理元素或数组HRESULT Remove( int nIndex );void RemoveAll(){ SetSize(0); }void Reset() { m_nSize = 0; } protected:// 指向存放实际数据的数组TYPE* m_pData;// 数组的元素个数int m_nSize;int m_nMaxSize; // max allocated HRESULTSetSizeInternal( int nNewMaxSize ); // This versiondoesn't call ctor or dtor.};
2. 主要成员方法
SetSizeInternal(…)检查缓冲区大小是否满足需要,如果不够用,则重建新的缓冲区
根据指定的数组成员个数nNewMaxSize,检查是否要重新分配内存。当然这个nNewMaxSize要求不能超过整形的最大值INT_MAX。
nNewMaxSize * sizeof( TYPE )便是所需分配的缓冲区内存大小(以字节为单位)。
如果需要重新分配内存,那么指向数组的m_pData指针和数组最多能存放元素个数的m_nMaxSize对象都要更新。
Add(…)在数组尾部添加一个新的元素
template<typename TYPE> HRESULT CGrowableArray <TYPE>::Add( const TYPE& value ){HRESULT hr;// 检查缓冲区if( FAILED( hr = SetSizeInternal( m_nSize + 1 ) ) )return hr;assert( m_pData != NULL );// 创建一个新的TYPE*对象::new ( &m_pData[m_nSize] ) TYPE;// 将值赋给这个新建的对象,增加元素个数m_pData[m_nSize] = value;++m_nSize;return S_OK;}
Insert(…)在数组中间插入一个新的元素
template<typename TYPE> HRESULT CGrowableArray <TYPE>::Insert( int nIndex, const TYPE& value ){HRESULT hr;// 检查传入的nIndex是否超出范围if( nIndex < 0 ||nIndex > m_nSize ){assert( false );return E_INVALIDARG;}// 检查缓冲区if( FAILED( hr = SetSizeInternal( m_nSize + 1 ) ) )return hr;// 移动内存MoveMemory( &m_pData[nIndex + 1], &m_pData[nIndex], sizeof( TYPE ) * ( m_nSize - nIndex ) );// 创建一个新的TYPE*对象::new ( &m_pData[nIndex] ) TYPE;//将值赋给这个新建的对象,增加元素个数m_pData[nIndex] = value;++m_nSize;return S_OK;}
IndexOf(…)
template<typename TYPE> int CGrowableArray <TYPE>::IndexOf( const TYPE& value, int iStart, int nNumElements ){// 检查传入的iStart和nNumElements是否有效if( iStart < 0 ||iStart >= m_nSize ||nNumElements < 0 ||iStart + nNumElements > m_nSize ){assert( false );return -1;}// 遍历数组各个元素,查找满足value值的成员,如果找到,则记录indexfor( int i = iStart; i < ( iStart + nNumElements ); i++ ){if( value == m_pData[i] )return i;}// Not foundreturn -1;}
3. 使用示例
CGrowableArray<int> m_TestList;m_TestList.Add(3);m_TestList.Add(5);m_TestList.Add(7);m_TestList.Add(9);int nSize = m_TestList.GetSize();int nIndex7 = m_TestList.IndexOf(7);if( nIndex7 != -1 ){m_TestList.Remove(nIndex7);}
- DXUT11框架浅析(8)--CGrowableArray
- DXUT11框架浅析(0)--预览
- DXUT11框架浅析(9)--DXUTDevice9
- DXUT11框架浅析(10)--DXUTDevice11
- DXUT11框架浅析(12)--CDXUTTimer
- DXUT11框架浅析(1)--错误处理
- DXUT11框架浅析(2)--回调函数
- DXUT11框架浅析(4)--调试相关
- DXUT11框架浅析(5)--基础函数
- DXUT11框架浅析(6)--功能函数
- DXUT11框架浅析(7)--全局变量管理
- DXUT11框架浅析(11)--枚举设备相关函数
- CGrowableArray
- DXUT11框架浅析(3)--运行时(Run-Time)动态链接D3D的DLL
- 类CGrowableArray
- 浅析模式与框架
- Symbian 应用程序框架浅析
- Symbian 应用程序框架浅析
- Oracle 10.2.0.5 DG For Windows 2008 R2
- AppSettings和ConnectionStrings的区别
- 你知道哪些极具创意的二维码QR广告?
- 存储过程分页
- 第8节进程创建和执行
- DXUT11框架浅析(8)--CGrowableArray
- {joseph问题}
- Ubunut更改分辨率
- [Codecademy] HTML&CSS 第五课:HTML Basics III
- C#-winform-MD5加密
- svn同步问题
- Qt中的qSort
- mysql正则表达式总结
- 当修改一些代码时,使用什么编译命令可以最有效率