第一次写博客,好紧张。。。
暑假在家学习 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); //流插入运算符重载
- 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;
- for (i = 0;; i++) {
- if (darray.a[i] == NULL) {
- break;
- } else
- if (darray.a[darray.n - 1] != NULL) {
- i = darray.n - 1;
- break;
- }
- }
- n = i;
- this - >a = new int[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;
- }
- 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;
- 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;
- cout << a << b << 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++ 复制构造函数,我也是看了这篇文章才发现的错误。。。
菜的抠脚。。。我也没办法了。。。
来源: http://www.bubuko.com/infodetail-2214388.html