十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
第一次写博客,好紧张。。。
创新互联主要从事网站建设、做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务康县,十年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575暑假在家学习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++复制构造函数,我是看了这篇文章才发现的错误。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。