重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
第一次写博客,好紧张。。。
永昌ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!
暑假在家学习STL,想要自己动手实现一下动态数组(实际上有很大区别,比如动态数组的地址值是固定的、一旦创建容量有上限。然而我自己实现的是地址也跟着随机分配的“动态数组”。。。),话不多说上源码:
#includeusing 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++复制构造函数,我是看了这篇文章才发现的错误。