第一次写博客,好紧张。。。
暑假在家学习STL,想要自己动手实现一下动态数组(实际上有很大区别,比如动态数组的地址值是固定的、一旦创建容量有上限。然而我自己实现的是地址也跟着随机分配的“动态数组”。。。),话不多说上源码:
#include<iostream>
using namespace std;
class D_array
{
private:
int *a;
int n;
public:
D_array();
D_array(const D_array & array);
~D_array();
int at(int i);//返回动态数组的第i位元素
bool is_full();//判断数组是否已满
void add(int in);//给动态数组增加新元素
void expand();//动态数组扩容
int len();//返回数组长度
friend ostream & operator << (ostream & output,const D_array & a);//流插入运算符重载
D_array & operator = (const D_array & darray);
int * print_address();//因为数组是动态分配的内存,所以需要接口返回现在的地址值
};
D_array::D_array()
{
n = 1;
a = new int[n];
int i;
for (i = 0; i < n; i++)
{
a[i] = NULL;//初始化数组元素
}
}
D_array::D_array(const D_array & darray)
{
int i, n;
n = darray.n;
this->a = new int[n];
this->n = darray.n;
for (i = 0; i < n; i++)
{
this->a[i] = darray.a[i];
}
}
D_array::~D_array()
{
delete[] a;//直接删除分配的内存空间
}
int D_array::at(int i)
{
if (i >= n)
{
cout << "wrong input!" << endl;
//return 0;
}
else return a[i];
}
bool D_array::is_full()
{
if (a[n - 1] == NULL)
{
return false;
}
else {
return true;
}
}
void D_array::add(int input)
{
int i;
if (is_full())
{
expand();
for (i = 0; i < n; i++)
{
if (a[i] == NULL) { break; }
else continue;
}
a[i] = input;
}
else
{
for (i = 0; i < n; i++)
{
if (a[i] == NULL) { break; }
else continue;
}
a[i] = input;
}
}
void D_array::expand()
{
int *b, i;
b = new int[n];//创建辅助数组
for (i = 0; i < n; i++)
{
b[i] = a[i];//储存原数组数据
}
a = new int[2 * n];//容量每次扩容2倍
for (i = 0; i < 2 * n; i++)
{
a[i] = NULL;//初始化
}
for (i = 0; i < n ; i++)//对自己完成深复制
{
a[i] = b[i];
}
n = 2 * n;//更改容量
delete[] b;//销毁辅助数组
}
int D_array::len()
{
int i;
for (i = 0; i < n; i++)
{
if (a[i] == NULL) { break; }
else {
continue;
}
}
return i;
}
D_array & D_array::operator=(const D_array & darray)
{
int i, n;
n = darray.n;
delete[] this->a;
this->a = new int[n];
this->n = darray.n;
for (i = 0; i < n; i++)
{
this->a[i] = darray.a[i];
}
return *this;
}
int * D_array::print_address()
{
return a;//返回地址值
}
ostream & operator<<(ostream & output, const D_array & darray)//不过多赘述
{
int i;
for (i = 0; i < darray.n; i++)
{
if (darray.a[i] == NULL) { break; }
else {
output << darray.a[i] << " ";
}
}
return output;
}
int main()
{
int key_in;
D_array a, c;
while (1) {
cin >> key_in;
if (key_in == -1) { break; }//一个只能输入非0元素的动态数组
else {
a.add(key_in);
}
cout << a.print_address() << endl;
}
D_array b = a;
c = a;
cout << a << endl;
cout << b << endl;
cout << c << endl;
//cout << a.len() << endl;
return 0;
}
过程十分简单,就是初始状态下数组不储存值(NULL)。通过add成员函数向动态分配的内存中写入数据。每次再加入数据时,先用is_full函数检验是否满。如果is_full返回真的话就用expand扩容,一次写入就结束。然后,顺便练习了一下重载<<。
不过写的时候还踩了一个很是脑残的坑。一开始我想用复制构造函数初始化b数组,然后就写出了如下代码:
D_array a,b; a = b;
实在是智障啊。。。错误的原因是:创建b数组时,通过默认构造函数初始化。然后再没有释放已分配的内存空间情况下就直接又用复制构造函数再一次初始化了b。所以在调用析构函数时,发生报错。
顺便分享一篇很不错的文章:http://www.cnblogs.com/raichen/p/4752025.html 详细介绍了C++复制构造函数,我是看了这篇文章才发现的错误。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。