两维的动态数组的C++封装

问题描述:

1.包装一个可扩展的动态的两维数组,支持泛型;

2.把存取的细节都包装起来,留一些简单的接口供外部使用;

3.稍作扩展可代替STL vector 使用;

程序代码:

#ifndef _TWODIM_ARRAY_H_
#define _TWODIM_ARRAY_H_

#include <stdlib.h>
#include <iostream>

/*
* encapsulate two dimension array
*
*/
template<class T, size_t ROW, size_t COL >
class TwoDimArray
{
public:
	TwoDimArray():m_storage(0), m_row(ROW), m_col(COL),
		          m_curRow(0), m_totalCount(0)

	{

	}

	/*
	*Copy constructor
	*
	*/
	template<class V, size_t row, size_t col >
	TwoDimArray( const TwoDimArray<V, row, col>& rhs ):m_storage(0), m_row(ROW), m_col(COL),
													   m_curRow(0), m_totalCount(0)
	{
		for( size_t i = 0; i < rhs.Size(); i++ )
		{
			Store( rhs[i] );
		}
	}

	/*
	* Destructor
	*
	*/
	~TwoDimArray()
	{
		Clear();
	}

	/*
	* Assignment operator overload
	*
	*/
	template<class V, size_t row, size_t col >
	TwoDimArray& operator = ( const TwoDimArray<V, row, col>& rhs )
	{
		if( this != &rhs )
		{
			Clear();

			for( size_t i = 0; i < rhs.m_totalCount; i++ )
			{
				Store( rhs[i] );
			}
		}

		return *this;
	}

	/*
	* Operator [] overload
	*
	*/
	T& operator [] ( int idx )
	{
		return m_storage[idx / m_col ][idx % m_col];
	}

	/*
	*operator [] overload
	*
	*/
	const T& operator [] ( int idx ) const
	{
		return m_storage[idx / m_col ][idx % m_col];
	}

	/*
	* Clear all object
	*
	*/
	void Clear()
	{
		for( int i = 1; i < m_row; i++ )
		{
			delete [] m_storage[i];
		}

		delete [] m_storage;

		m_col = 0;
		m_row = 0;
		m_curRow = 0;
	}

	/*
	*
	*
	*/
	size_t Size() const
	{
		return m_totalCount;
	}

	/*
	*
	*
	*/
	void Reset()
	{
		m_totalCount = 0;
	}

	/*
	*
	*
	*/
	T& At( size_t idx )
	{
		return m_storage[idx / m_col ][idx % m_col];
	}

	/*
	*
	*
	*/
	const T& At( size_t idx ) const
	{
		return m_storage[idx / m_col ][idx % m_col]
	}

	/*
	*
	*
	*/
	T& Cur( size_t idx )
	{
		return (*this)[idx];
	}

	/*
	*
	*
	*/
	T& Prev( size_t idx )
	{
		assert( idx < m_totalCount && idx > 0 );
		return (*this)[idx - 1];
	}

	/*
	*
	*
	*/
	T& Next( size_t idx )
	{
		assert( idx < m_totalCount - 1 );
		return (*this)[idx + 1];
	}

	/*
	*
	*
	*/
	const T& Cur( size_t idx) const
	{
		return (*this)[idx];
	}

	/*
	*
	*
	*/
	const T& Prev( size_t idx ) const
	{
		assert( idx < m_totalCount && idx > 0 );
		return (*this)[idx - 1];
	}

	/*
	*
	*
	*/
	const T& Next( size_t idx ) const
	{
		assert( idx < m_totalCount - 1 );
		return (*this)[idx + 1];
	}

	/*
	* Store object to array
	*
	*/
	void Store( const T& data )
	{
		*Store() = data;
		m_totalCount++;
	}

private:
	/*
	*
	*
	*/
	T* Store()
	{
		if( !m_totalCount )
		{
			m_storage = new T*[m_row];
			memset( m_storage, 0x00, sizeof(T*)*m_row );

			m_storage[m_curRow] = new T[m_col];
			memset( m_storage[m_curRow], 0x00, sizeof(T) * m_col );

			return &m_storage[m_curRow][0];
		}

		size_t curRow = m_totalCount / m_col;
		if( curRow > m_curRow )
		{
			m_curRow++;
			m_storage[m_curRow] = new T[m_col];
			memset( m_storage[m_curRow], 0x00, sizeof(T) * m_col );

			return &m_storage[m_curRow][0];
		}
		else
		{
			return &m_storage[curRow][m_totalCount % m_col];
		}
	}

private:
	T**    m_storage;
	size_t m_col;
	size_t m_row;
	size_t m_curRow;
	size_t m_totalCount;

};

/*
*Test interface
*
*/
void TestTwoDimArray()
{
	TwoDimArray<int, 6, 7> dimArr;

	int len = 6 * 6;
	for( int i = 0; i < len; i++ )
	{
		dimArr.Store( i );
	}

	for( int i = 0; i < len; i++ )
	{
		std::cout << dimArr.At(i) << std::endl;
		assert( dimArr[i] == i );
	}

	TwoDimArray<int, 10, 10> newdimArr(dimArr);
	assert( newdimArr.Size() == dimArr.Size() );
	for( int i = 0; i < newdimArr.Size(); i++ )
	{
		assert( newdimArr[i] == dimArr[i] );
	}

}

#endif 

compile and run in visual studio 2005

两维的动态数组的C++封装,码迷,mamicode.com

时间: 2024-10-07 19:09:31

两维的动态数组的C++封装的相关文章

第十章 动态数组

当写下这个题目的时候,笔者心里其实非常犯难.因为从本质上来说,本章想阐述的内容与题目所宣示的概念,其实是不一样的.在编程中,我们常常要处理一段长度未知的数据,而且,运行过程中长度可能会发生变化,现行的C/C++标准没有提供在栈段和数据段内存中的实现,只提供堆中的实现,例如可以象下面代码那样在堆中分配一段内存,以处理一组长度不确定的整数: int *p = ( int* )malloc( n * sizeof( int ) ); 现在我们常常将这段堆内存称为“动态数组”.这正确吗?数组是一个高层概

【转】CUDA与二维动态数组

1 /* 2 * Copyright 徐洪志(西北农林科技大学.信息工程学院). All rights reserved. 3 * Data: 2012-4-22 4 */ 5 // 6 // 此程序是演示了二维动态数组空间申请和与显存数据相互拷贝的两种方法 7 #include <stdio.h> 8 //#include <cutil_inline.h> 9 #include <iostream> 10 #include <cuda_runtime.h>

一维动态数组和二维动态数组的创建和使用

#include<stdio.h> #include<malloc.h> void main(){ int *a,n=10,i; /* calloc()函数的原型是:(void *)calloc(unsigned n,unsigned size) calloc()函数用于向系统动态申请n个,每个占sizege字节的内存单元,函数返回值为所申请的内存空间首地址 malloc和calloc主要区别在于,当系统的内存只剩下一些非常小的碎片时,用calloc函数设计的动态数组的时间效率优于

二维动态数组

之前都是写的小程序,一直用的静态数组,也没出现问题. 可是,最近碰到大型程序和工程,这时就要用动态数组了. 因为静态数组时保存在栈中的,而动态数组保存在堆中. 计算机的栈只有1M大小,而堆可以理论上达到计算机内存大小, 可见当大型工程数据量非常大时,必须使用动态数组了. c++的动态数组的建立和删除要用到new和delete, new用来开辟内存空间,delete用来删除内存空间. 建立二维动态数组test,第一维大小为a,第二维大小为b. 下面时具体实现代码: 1 int **test=new

C++中使用模板,new创建2维动态数组

1 // 使用模板和new创建2维动态数组 2 3 #include<iostream> 4 #include<exception> 5 #include<cstdlib> 6 #include<iomanip> 7 using namespace std; 8 9 template<class Type> 10 bool Make2DArray(Type **&x,int rows,int cols) 11 { 12 int i; 13

Delphi-基础(常量、集合、数组[动态数组、多维数组])

一.常量 1.常量定义:一开始定义好的值,以后在程序的运行过程中不允许改变 1 const 2 Pi : Double = 3.141592; //定义为常量 3 {常量的定义方式,可以不进行类型的声明,编译器会根据具体值决定常量的的类型} 4 Pi2 = 3.1415; 2.常量使用 枚举:常量集 type 枚举名=(标识符1,标识符2,标识符3,......) 1 type 2 {正常情况下,枚举类型的索引是从0开始} 3 EColors = (RED,GREEN,BLUE); 4 EWee

封装动态数组类Array

功能: 1.增.删.改.查 2.扩容.缩容 3.复杂度分析 4.均摊复杂度 5.复杂度震荡 分析动态数组的时间复杂度: 分析resize的时间复杂度: public class Array<E> { private E[] data; private int size; // 构造函数,传入数组的容量capacity构造Array public Array(int capacity){ data = (E[])new Object[capacity]; size = 0; } // 无参数的构

封装一个简单的动态数组

package com.immoc; import java.util.ArrayList; import java.util.List; /** * 实现动态数组 * */ public class Array <E> { private E[]data;; private int size; public Array(int capacity){ data = (E[]) new Object[capacity]; size = 0; } public Array(){ this(10);

【C/C++学院】0828-数组与指针/内存分配/数据结构数组接口与封装

[送给在路上的程序员] 对于一个开发者而言,能够胜任系统中任意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并可以运用到系统中,由此简化系统的开发,是其架构生涯的第一步. 对于一个开发团队而言,能在短期内开发出用户满意的软件系统是起核心竞争力的体现. 每一个程序员都不能固步自封,要多接触新的行业,新的技术领域,突破自我. 数组与指针 #include<stdio.h> #include<stdlib.h> void main1() { int a[10]