动态数组

2.1.4 DynamicArray (动态数组)

在C 中,数组的大小需要预先的声明,在程序运行过程中是不能更改的,也即数组的大
小是静态的。C++Builder 中,实现了动态数组,也就是在程序运行中可以动态的改变数组的
大小。
C++Builder 中动态数组是以类的方式实现的,它提供了动态数组类 (DynamicArray)模
板,声明如下:
template class DELPHIRETURN DynamicArray;
声明动态数组时的语法如下:
DynamicArray ArrayName;
其中type 为动态数组元素的数据类型,它可以是任何数据类型、组件对象,也可以是动
态数组对象,这样,便成为多维动态数组。

Length 属性
动态数组的大小可以通过其Length 属性来获得和更改,如下:
DynamicArray arrayOfInt;
arrayOfInt.Length = 10;
cout << "ArrayLength: " << arrayOfInt.Length << endl;

设置动态数组的Length 为0,将释放该动态数组占用的内存。

数据访问
对于动态数组的访问,实现了跟静态数组一样的“[]”操作符。通过该操作符可以对指
定元素进行赋值和读取,示例如下:
void InitArray(DynamicArray &c_array)

{
c_array[0] = 'A';
c_array[1] = 'B';
cout << "Third char is: " << c_array[2];
}

动态数组的范围
动态数组的Low 和High 属性分别表示动态数组最小位置和最大位置,也即它们给出动
态数组的位置范围,如下:
int TotalArray(const DynamicArray& arrayOfInt)

{
int total=0;
for (int i=arrayOfInt.Low; i<=arrayOfInt.High; i++)
total += arrayOfInt[i];
return total;
}
Low 属性总是返回0,High 属性返回Length-1,所以遍历一个动态数组也可以用下面的代码:
for (int i=0; i
动态数组的赋值与比较
动态数组提供 “=”运算符,实现动态数组的赋值,但是,需要注意的是,将一个动态
数组赋给另一个动态数组的操作仅仅是将它们的指针指向同一个位置,并不是赋值它们指向
的内存内容。相似的,对两个动态数组的比较,也是比较它们的指针位置,而不是指针指向
的内容。如果要赋值动态数组的内容,应该使用动态数组的Copy 或者CopyRange 方法。示
例如下:
void foo(DynamicArray &i_array)

{
DynamicArray temp = i_array;
assert(temp == i_array); // temp 和 i_array 指向同一个内存地址
i_array[0] = 20; //为数组中第一个元素赋值
assert(temp[0] == 20); // temp 数组可以看到i_array 数组中的变化
temp = i_array.Copy(); // 拷贝i_array 数组的内容到temp 数组
temp[0] = 10;
assert(temp[0] != i_array[0]); // 上面一句对temp 的第一个元素赋值,它不改变i_array 数组
//的内容
}

CopyRange 方法的声明如下:
DynamicArray CopyRange(int startIndex, int count) const;
void CopyRange(DynamicArray &dst, int startIndex, int count) const;
它用来拷贝动态数组中从startIndex 开始的count 个元素到数组dst 中,使用示例如下:
newArray = array.CopyRange(3, 5);

多维动态数组
前面已经说道,动态数组元素的类型可以也是动态数组,这样便是多维动态数组。多维
动态数组的每一维可以有不同的长度,也就是,对于每一维可以分别设定其Length 属性,如
下面的代码:
typedef DynamicArray< DynamicArray < AnsiString > > T2DStringArray;

void foo(T2DStringArray &s_array)
{
SetLength(s_array, 10);
for (int i=0; i{ // 设定每一列的长度
SetLength(s_array[i], i+1);
for (int j=0;j//对数组元素赋值
s_array[i][j] = itoa(i*10+j);
}
}

相关文档
最新文档