C++模板编程实现二维数组

数组在C语言里面经常使用,有一个缺陷就是必须在定义的时候就指定大小,一旦申请后这片区域就不能动态的扩展。但是很多情况下我们并不知道大小是多少,于是就需要动态分配内存来存储。这里仅仅是一个小例,希望可以起到抛砖引玉的作用。

为什么使用模板?使用模板的通用性很强,数组可能是int类型,也可能是bool类型……,使用模板就避免了为每一种类型去量身定制一套相同的功能。我想,这也是C++模板的初衷吧。

直接上代码:

template<class T, int row=0, int column=0>
class CMyArray
{
public:
	CMyArray()
		:m_pData(NULL)
		,m_nRow(row)
		,m_nColumn(column)
	{
		if ( m_nRow>0 && m_nColumn>0 )
			Allocate();
	}
	~CMyArray()
	{
		Free();
	}
	bool Resize(const int nRow, const int nColumn)
	{
		if ( nRow<=0 || nColumn<=0 )
			return false;
		m_nRow		= nRow;
		m_nColumn	= nColumn;
		Allocate();
		return true;
	}
	T GetAt(const int nRow, const int nColumn)
	{
		if ( nRow>=m_nRow || nColumn>=m_nColumn )
			return T();
		return *(m_pData+nRow*m_nColumn+nColumn);
	}
	void SetAt(const int nRow, const int nColumn, const T& data)
	{
		if ( nRow>=m_nRow || nColumn>=m_nColumn )
			return ;
		*(m_pData+nRow*m_nColumn+nColumn) = data;
	}
protected:
	void Allocate()
	{
		Free();
		m_pData = (T*)malloc(m_nRow*m_nColumn*sizeof(T));
	}
	void Free()
	{
		if ( m_pData )
		{
			free(m_pData);
			m_pData = NULL;
		}
	}
private:
	T*	m_pData;
	int	m_nRow;
	int m_nColumn;
};
buffer里面存储着这片连续内存空间的地址,对于这个区域的操作(释放/申请),最好是在一个函数里面进行,以免在多线程时出现内存读写错误。(多线程时,我们只需要对这个函数里面加锁就可以了)。

后记:

对于多维数组,还可以扩展。性能方面这里是没有考虑的,如果需要申请的内存小于等于当前内存时,完全可以不进行释放/申请过程。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值