C++实现的动态数组

第一次写博客,好紧张。。。

暑假在家学习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++复制构造函数,我也是看了这篇文章才发现的错误。。。

菜的抠脚。。。我也没办法了。。。

时间: 2024-12-11 16:27:09

C++实现的动态数组的相关文章

C++ Primer 笔记——动态数组

1.动态数组定义时也需要指明数组的大小,但是可以不是常量. int i; int arr[i]; // 错误,数组的大小必须为常量 int *p = new int[i]; // 正确,大小不必是常量 2.虽然我们通常称 new T[ ] 分配的内存为动态数组,但我们并未得到一个数组类型的对象,而是得到一个数组元素类型的指针.所以不能对动态数组调用begin或end,也不能用for语句来处理动态数组中的元素. 3.默认情况下,new分配的对象,不管是单个分配的还是数组中的,都是默认初始化的.我们

通用型动态数组的总结

基本数据结构之-通用型动态数组 动态数组的应用主要是对于长度未知的数组,先开辟一段空间来存储数据,当空间不够时,在开辟两倍的空间来存储数据 和普通数组的区别就是,我们可以不用关心数组的长度的问题,唯一需要关注的就是数据的类型是自定义数据类型还是基本数据类型,但是不论是基本数据类型还是自定义的数据类型,都需要自定义两个函数,这两个函数时遍历(打印)函数和比较函数,因为,在传递的是地址,没法再里面判断是什么类型,只能交给使用者去定义它的想关的函数, 先说基本的结构: 为了适应更多的数据类型,我们存储

动态数组

动态数组也叫数组的动态联编,有动态联编自然也有静态联编,静态联编就是数组的长度在编译时设置,而动态联编是在运行时才为数组分配空间,其长度在运行时设置,使用完这种动态数组后,应该释放内存. 静态联编:int arr[10];       //数组长度为一常量 动态数组在ISO C99后就有了新的规定(如下图文件): 这是部分说明,完整的说明在 ISO/IEC9899 标准的 6.7.5.2 Array declarators里可以看到,这个里面加入了可变长数组的相关规定. #include <io

delphi 动态数组的使用

var RowArray: array of string; i: integer; begin SetLength(ArrayRow, G2.ColumnCount-1); // 动态数组初始化 先定义长度 for i := 0 to G2.ColumnCount-1 do begin ArrayRow[i] := G2.Cells[i, G2.Selected]; // 将点击的行存入数组内,若比较不相等时,则post提交保存数据. end; end;

C# 动态数组(ArrayList)

动态数组(ArrayList)代表可单独被索引的对象的集合. 动态数组可以自动调整大小. 允许动态内存的分配,怎加,搜索,排序. using System; using System.Collections; namespace CollectionApplication { class Program { static void Main(string[] args) { ArrayList al = new ArrayList(); Console.WriteLine("Adding som

动态数组使用

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int main() 5 { 6 int i; 7 int n; //用于记录输入的整数的个数 8 int *p; //用于指向动态数组的存储空间 9 int sum=0,average; //用于记录输入的整数的和与平均值 10 11 scanf("%d",&n);//输入要输入的整数的个数 n 12 13 p=calloc(n,sizeof(int)); //动

[转]delphi 删除动态数组的指定元素

type TArr = array of TPoint; {把数组先定义成一个类型会方便许多, 这里仅用 TPoint 测试} {删除动态数组指定元素的过程: 参数 arr 是数组名, 参数 Index 是要删除的索引} procedure DeleteArrItem(var arr: TArr; Index: Integer); var Count: Cardinal; begin Count := Length(arr); if (Count = 0) or (Index < 0) or (

nginx学习七 高级数据结构之动态数组ngx_array_t

1 ngx_array_t结构 ngx_array_t是nginx内部使用的数组结构.nginx的数组结构在存储上与大家认知的C语言内置的数组有相似性,比如实际上存储数据的区域也是一大块连续的内存.但是数组除了存储数据的内存以外还包含一些元信息来描述相关的一些信息,并且可以动态增长.下面 我们从数组的定义上来详细的了解一下.ngx_array_t的定义位于src/core/ngx_array.c|h里面. struct ngx_array_s { void *elts;//数组的首地址 ngx_

简单动态数组的实现代码

以下是本人动态数组实现的源代码,仅供参考,不足之处请指正: import java.util.*; public class My_List implements Collection{ /***************************************************************/ //测试模块 //主方法,测试用 public static void main(String [] args){ /* My_List ma = new My_List(); /

[转]C语言构建动态数组完整实例

原文地址:http://www.jb51.net/article/52153.htm 本文以一个完整的实例代码简述了C语言构建动态数组的方法,供大家参考,完整实例如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <stdio.h> #include <malloc.h> int main(void) {     int len;     int * arr;     printf("请输入数组长度:&q