📄 namedarray.h
字号:
#ifndef NAMED_ARRAY_HEAD_FILE
#define NAMED_ARRAY_HEAD_FILE
#pragma once
#include "Array.h"
//////////////////////////////////////////////////////////////////////////
//宏定义
#define INFINITY_COUNT -1 //无限数目
//数组模板类
template <class TYPE>
class CNamedArrayTemplate
{
//变量定义
protected:
CArrayTemplate<LPCTSTR> m_IndexItem; //索引对象
CArrayTemplate<TYPE *> m_StorageItem; //存储对象
//函数定义
public:
//构造函数
CNamedArrayTemplate(void);
//析构函数
virtual ~CNamedArrayTemplate(void);
//信息函数
public:
//是否空组
bool IsEmpty() const;
//获取数目
INT_PTR GetCount() const;
//获取上限
INT_PTR GetUpperBound() const;
//功能函数
public:
//获取缓冲
TYPE * GetData();
//获取缓冲
const TYPE * GetData() const;
//释放内存
void FreeExtra();
//增加元素
INT_PTR Add(LPCTSTR Named, TYPE newElement);
////拷贝数组
//void Copy(const CArrayTemplate & Src);
////追加数组
//INT_PTR Append(const CArrayTemplate & Src);
//获取元素
TYPE & GetAt(INT_PTR nIndex);
//获取元素
const TYPE & GetAt(INT_PTR nIndex) const;
//获取元素
TYPE & ElementAt(INT_PTR nIndex);
//获取元素
const TYPE & ElementAt(INT_PTR nIndex) const;
//操作函数
public:
//设置大小
void SetSize(INT_PTR nNewSize);
//设置元素
void SetAt(INT_PTR nIndex, TYPE newElement);
//设置元素
void SetAtGrow(INT_PTR nIndex, TYPE newElement);
////插入数据
//void InsertAt(INT_PTR nIndex, const CArrayTemplate & Src);
//插入数据
void InsertAt(INT_PTR nIndex, TYPE newElement, INT_PTR nCount=1);
//删除数据
void RemoveAt(INT_PTR nIndex, INT_PTR nCount=1);
//删除元素
void RemoveAll();
//操作重载
public:
//操作重载
TYPE & operator[](INT_PTR nIndex);
//操作重载
const TYPE & operator[](INT_PTR nIndex) const;
//内部函数
private:
//申请内存
void AllocMemory(INT_PTR nNewCount);
};
//////////////////////////////////////////////////////////////////////////
// CNamedArrayTemplate<TYPE> 内联函数
//是否空组
template <class TYPE>
_inline bool CNamedArrayTemplate<TYPE>::IsEmpty() const
{
_ASSERT(this);
return m_IndexItem.IsEmpty();
}
//获取数目
template <class TYPE>
_inline INT_PTR CNamedArrayTemplate<TYPE>::GetCount() const
{
_ASSERT(this);
return m_IndexItem.GetCount();
}
//获取上限
template <class TYPE>
_inline INT_PTR CNamedArrayTemplate<TYPE>::GetUpperBound() const
{
_ASSERT(this);
return m_IndexItem.GetUpperBound();
}
//增加元素
template <class TYPE>
_inline INT_PTR CNamedArrayTemplate<TYPE>::Add(LPCTSTR Named, TYPE newElement)
{
INT_PTR nIndex;
TCHAR* lpNamed = new TCHAR[64];
strcpy(lpNamed, Named);
nIndex = m_IndexItem.Add(lpNamed);
m_StorageItem.Add(&newElement);
return nIndex;
}
//操作重载
template <class TYPE>
_inline TYPE & CNamedArrayTemplate<TYPE>::operator[](INT_PTR nIndex)
{
return m_StorageItem[nIndex];
}
//操作重载
template <class TYPE>
_inline const TYPE & CNamedArrayTemplate<TYPE>::operator[](INT_PTR nIndex) const
{
return m_StorageItem.GetAt(nIndex);
}
//////////////////////////////////////////////////////////////////////////
// CNamedArrayTemplate<TYPE> 外联函数
//构造函数
template <class TYPE>
CNamedArrayTemplate<TYPE>::CNamedArrayTemplate()
{
return;
}
//析构函数
template <class TYPE>
CNamedArrayTemplate<TYPE>::~CNamedArrayTemplate()
{
//清理对象
TYPE * pObject=NULL;
for (INT_PTR i=0;i<m_StorageItem.GetCount();i++)
{
pObject=m_StorageItem[i];
_ASSERT(pObject!=NULL);
SafeDelete(pObject);
}
m_IndexItem.RemoveAll();
m_StorageItem.RemoveAll();
return;
}
//获取缓冲
template <class TYPE>
TYPE * CNamedArrayTemplate<TYPE>::GetData()
{
_ASSERT(this);
return m_StorageItem.GetData();
}
//获取缓冲
template <class TYPE>
const TYPE * CNamedArrayTemplate<TYPE>::GetData() const
{
_ASSERT(this);
return m_StorageItem.GetData;
}
//释放内存(生成连续的内存块,并释放现有的内存块)
template <class TYPE>
void CNamedArrayTemplate<TYPE>::FreeExtra()
{
m_IndexItem.FreeExtra();
m_StorageItem.FreeExtra();
return;
}
//
////拷贝数组
//template <class TYPE>
//void CNamedArrayTemplate<TYPE>::Copy(const CArrayTemplate & Src)
//{
//
// return;
//}
//
////追加数组
//template <class TYPE>
//INT_PTR CNamedArrayTemplate<TYPE>::Append(const CArrayTemplate & Src)
//{
//
// return m_StorageItem.GetData();
//}
//获取元素
template <class TYPE>
TYPE & CNamedArrayTemplate<TYPE>::GetAt(INT_PTR nIndex)
{
_ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
if ((nIndex>=0)&&(nIndex<m_nElementCount)) return m_StorageItem[nIndex];
AfxThrowInvalidArgException();
}
//获取元素
template <class TYPE>
const TYPE & CNamedArrayTemplate<TYPE>::GetAt(INT_PTR nIndex) const
{
_ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
if ((nIndex>=0)&&(nIndex<m_nElementCount)) return m_StorageItem[nIndex];
AfxThrowInvalidArgException();
}
//获取元素
template <class TYPE>
TYPE & CNamedArrayTemplate<TYPE>::ElementAt(INT_PTR nIndex)
{
_ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
if ((nIndex>=0)&&(nIndex<m_nElementCount)) return m_StorageItem[nIndex];
AfxThrowInvalidArgException();
}
//获取元素
template <class TYPE>
const TYPE & CNamedArrayTemplate<TYPE>::ElementAt(INT_PTR nIndex) const
{
_ASSERT((nIndex>=0)&&(nIndex<m_nElementCount));
if ((nIndex>=0)&&(nIndex<m_nElementCount)) return m_StorageItem[nIndex];
AfxThrowInvalidArgException();
}
//设置大小
template <class TYPE>
void CNamedArrayTemplate<TYPE>::SetSize(INT_PTR nNewSize)
{
//效验参数
_ASSERT(this);
_ASSERT(nNewSize>=0);
m_IndexItem.SetSize(nNewSize);
m_StorageItem.SetSize(nNewSize);
return;
}
//设置元素
template <class TYPE>
void CNamedArrayTemplate<TYPE>::SetAt(INT_PTR nIndex, TYPE newElement)
{
_ASSERT((nIndex>=0)&&(nIndex<m_nSize));
if ((nIndex>=0)&&(nIndex<m_nElementCount)) m_StorageItem[nIndex]=newElement;
}
//设置元素并设置增长上限
template <class TYPE>
void CNamedArrayTemplate<TYPE>::SetAtGrow(INT_PTR nIndex, TYPE newElement)
{
//效验参数
_ASSERT(this);
_ASSERT(nIndex>=0);
//设置元素
if (nIndex>=m_nElementCount) m_StorageItem.SetSize(m_StorageItem.GetCount()+1);
m_StorageItem[nIndex]=newElement;
return;
}
//删除数据
template <class TYPE>
void CNamedArrayTemplate<TYPE>::RemoveAt(INT_PTR nIndex, INT_PTR nCount)
{
//效验参数
_ASSERT(this);
_ASSERT(nIndex>=0);
_ASSERT(nCount>=0);
_ASSERT(nIndex+nCount<=m_nElementCount);
m_IndexItem.RemoveAt(nIndex, nCount);
m_StorageItem.RemoveAt(nIndex, nCount);
return;
}
//删除所有元素
template <class TYPE>
void CNamedArrayTemplate<TYPE>::RemoveAll()
{
_ASSERT(this);
m_IndexItem.RemoveAll();
m_StorageItem.RemoveAll();
return;
}
//////////////////////////////////////////////////////////////////////////
typedef CNamedArrayTemplate<char*> CStringArray;
typedef CStringArray* LPStringArray;
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -