C++数据结构与算法——学习笔记[1]动态数组

基本数据结构(ADT)1

动态数组

数组对象的内存表示

在Array< T>中,有两个部分

  1. 包含了三个域:data,base,length
    data:指向数组数据的指针
    base,length:用于数组下标的计算
  2. 包含了一套存储数据的连续内存元素,由data指向

Array< T>所占空间
S ( n ) = s i z e o f ( A r r a y &lt; T &gt; ) + n s i z e o f ( T ) S(n)= sizeof(Array&lt;T&gt;) + nsizeof(T) S(n)=sizeof(Array<T>)+nsizeof(T)

S ( n ) = s i z e o f ( T ∗ ) + 2 s i z e o f ( i n t ) + n s i z e o f ( T ) S(n)=sizeof(T*)+2sizeof(int)+nsizeof(T) S(n)=sizeof(T)+2sizeof(int)+nsizeof(T)
若数据类型和各指针大小是固定的常数
则sizeof(T*)=O(1),sizeof(int)=O(1)
S ( n ) = n s i z e o f &lt; T &gt; + O ( 1 ) S(n)=nsizeof&lt;T&gt;+O(1) S(n)=nsizeof<T>+O(1)

Array< T >类的基础定义
template <class T>
class Array{
	protected:
		T* data;
		int base;
		int length;
	public:
		Array();
		Array(unsigned int,unsigned int=0);
		~Array();

		Array(Array const&);
		Array& operator = (Array const&);

		T const& operator [] (unsigned int) const;
		T& operator [] (unsigned int);
		
		T const* Data () const;
		unsigned int base ;
		unsigned int length;

		void SetBase(unsigned int);
		void SetLength(unsigned int);
}
缺省构造函数
T::T();
/*##############*/
template <class T>
Array<T>::Array():
	data (new T []),
	base (0),
	length (0)
	{}

分配一个T类型的零长度数组,把base,length设为0

构造函数
template <class T>
Array<T>::Array(unsigned int n,unsigned int m):
	data (new T [n]),
	base (m),
	length (n)
	{}

C++中,分配一个数组时,有两步

  1. 从堆2中给数组分配内存
  2. 调用缺省构造函数对每个数组中的元素进行初始化
存取器函数

返回data,base,length

template <class T>
T const* Array<T>::Data () const
	{return data;}//返回ArrayT中T型指针data

template <class T>
unsigned int Array<T>::Base () const
	{return base;}//返回ArrayT中int base

template <class T>
unsigned int Array<T>::Length () const
	{return length;}//返回ArrayT中int length

提供了只读操作、

下标操作函数

设定operator[ ]的数组下标范围,在越界时弹出out_of_range异常
返回const或非const的T类对象引用

/*#######const版本########*/
template <class T>
T const& Array<T>::operator [] (unsigned int position) const
{
	unsigned int const offset = position - base;
	if(offset>=length)//大于等于不是大于,因为数组的范围是0~length-1
		throw out_of_range ("invalid position");//弹出out_of_range
	return data[offset]//返回
}
/*#######非const版本########*/
template <class T>
T& Array<T>::operator [] (unsigned int position) 
{
	unsigned int const offset = position - base;
	if(offset>=length)//大于等于不是大于,因为数组的范围是0~length-1
		throw out_of_range ("invalid position");//弹出out_of_range
	return data[offset]//返回
}

该函数运行时间为常数

数组大小重调

SetBase步骤

  1. 改变base的值
template <class T>
void Array<T>::SetBase (unsigned int newBase)
{
	base=newBase;
}

SetLength步骤

  1. 以newLength建立新T* data和新数组
  2. 将原数据复制到新数组(多了舍去,少了留空)即0~min个(min为length和newLength中最小的,因为新的数组可能比原来小)
  3. 改变data,length的值,delete掉原先data指向的数据
template <class T>
void Array<T>::SetLength (unsigned newLength) 
{
	T* const newData = new T [newLength]
	/* 1. 以newLength建立新T* data和新数组 */
	unsigned const min = length < newLength ? lenth : newLength;
	/*min赋值*/
	for(int i=0;i<min;i++)
		newData [i]=data [i];
		/*逐个复制*/
	delete [] data;
	data = newData;
	length = newLength;
	/* 3.  改变data,length的值,delete掉原先data指向的数据*/

}

完工!!

实现了动态数组Array< T >类的基本功能
借此可以了解数组的基本实现和对原有数组劣势的改进


  1. [abstract data type] ↩︎

  2. [heap] ↩︎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值