基本数据结构(ADT)1
动态数组
数组对象的内存表示
在Array< T>中,有两个部分
- 包含了三个域:data,base,length
data:指向数组数据的指针
base,length:用于数组下标的计算 - 包含了一套存储数据的连续内存元素,由data指向
Array< T>所占空间
S
(
n
)
=
s
i
z
e
o
f
(
A
r
r
a
y
<
T
>
)
+
n
s
i
z
e
o
f
(
T
)
S(n)= sizeof(Array<T>) + 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
<
T
>
+
O
(
1
)
S(n)=nsizeof<T>+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++中,分配一个数组时,有两步
- 从堆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步骤
- 改变base的值
template <class T>
void Array<T>::SetBase (unsigned int newBase)
{
base=newBase;
}
SetLength步骤
- 以newLength建立新T* data和新数组
- 将原数据复制到新数组(多了舍去,少了留空)即0~min个(min为length和newLength中最小的,因为新的数组可能比原来小)
- 改变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 >类的基本功能
借此可以了解数组的基本实现和对原有数组劣势的改进