用C++实现数组的自动扩容

用到的技巧

其实就是指针的简单使用,能够通过练习,加深对指针的理解。而在C++容器中,vector也是用数组实现的自动扩容。

当然,我们需要保证数组名不会随之改变,不然就不算什么自动扩容了。

代码部分

  1. 动态数组的创建。

假设数组的长度是未知的,完全可以用new在堆区分配内存。

int *p =new int[len];

len的长度初始化为一个较小的数字即可。

  1. 判断数组的下标使用情况,满了之后创建新的数组。

vector中,是自动扩容两倍。

  1. 释放之前用到的内存空间,并且将旧的数组指针指向新的数组指针。
<code>for(int j=0;j{
p[j]=array[j];
}
delete[] array;
array=p;
array[i]=a;
/<code>

重点来了,delete[] array之后,究竟发生了什么呢?

其实是array这个指针的内存空间被释放 ,指针成为了空指针,能够被访问,但不会指向任何内存地址。

而我们让array重新指向p之后,就完成了数组的扩容,并且不改变之前的名称!

至于下次进行delete操作,也不会有什么影响,因为delete只关心释放的内存地址究竟是什么,而指针变量虽然还是原先的array,但是指向的内存却是新申请的,可以释放的p。

以下是示例程序。

demo

<code>#include <iostream>
using namespace std;

int main()
{
cout< int len;
cin>>len;
if(len<=0)
{
return -1;
}
int *array=new int[len];
int a=0;
int i=0;
cout< while(cin>>a)
{
if(a==-1)
{
break;
}

if(i {
array[i]=a;
i++;
cout< }
else//i>=len
{
cout< int *p=new int[len*2];
for(int j=0;j {
p[j]=array[j];
}
delete[] array;
array=p;
array[i]=a;
i++;
len=len*2;
cout< }
}
for(int k=0;k {
cout< cout<<array> }



return 0;
}/<array>
/<iostream>/<code>


分享到:


相關文章: