真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++實(shí)現(xiàn)的動(dòng)態(tài)數(shù)組

    第一次寫博客,好緊張C++實(shí)現(xiàn)的動(dòng)態(tài)數(shù)組。。。

永昌ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

   暑假在家學(xué)習(xí)STL,想要自己動(dòng)手實(shí)現(xiàn)一下動(dòng)態(tài)數(shù)組(實(shí)際上有很大區(qū)別,比如動(dòng)態(tài)數(shù)組的地址值是固定的、一旦創(chuàng)建容量有上限。然而我自己實(shí)現(xiàn)的是地址也跟著隨機(jī)分配的“動(dòng)態(tài)數(shù)組”。。。),話不多說上源碼:

#include

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);//返回動(dòng)態(tài)數(shù)組的第i位元素
	bool is_full();//判斷數(shù)組是否已滿
	void add(int in);//給動(dòng)態(tài)數(shù)組增加新元素
	void expand();//動(dòng)態(tài)數(shù)組擴(kuò)容
	int len();//返回?cái)?shù)組長(zhǎng)度
	friend ostream & operator << (ostream & output,const D_array & a);//流插入運(yùn)算符重載
	D_array & operator = (const D_array & darray);
	int * print_address();//因?yàn)閿?shù)組是動(dòng)態(tài)分配的內(nèi)存,所以需要接口返回現(xiàn)在的地址值
};

D_array::D_array()
{
	n = 1;
	a = new int[n];
	int i;
	for (i = 0; i < n; i++)
	{
		a[i] = NULL;//初始化數(shù)組元素
	}
}

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;//直接刪除分配的內(nèi)存空間
}

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];//創(chuàng)建輔助數(shù)組
	for (i = 0; i < n; i++)
	{
		b[i] = a[i];//儲(chǔ)存原數(shù)組數(shù)據(jù)
	}
	a = new int[2 * n];//容量每次擴(kuò)容2倍
	for (i = 0; i < 2 * n; i++)
	{
		a[i] = NULL;//初始化
	}
	for (i = 0; i < n ; i++)//對(duì)自己完成深復(fù)制
	{
		a[i] = b[i];
	}
	n = 2 * n;//更改容量
	delete[] b;//銷毀輔助數(shù)組
}

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; }//一個(gè)只能輸入非0元素的動(dòng)態(tài)數(shù)組
		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;
}

    過程十分簡(jiǎn)單,就是初始狀態(tài)下數(shù)組不儲(chǔ)存值(NULL)。通過add成員函數(shù)向動(dòng)態(tài)分配的內(nèi)存中寫入數(shù)據(jù)。每次再加入數(shù)據(jù)時(shí),先用is_full函數(shù)檢驗(yàn)是否滿。如果is_full返回真的話就用expand擴(kuò)容,一次寫入就結(jié)束。然后,順便練習(xí)了一下重載<<。

    不過寫的時(shí)候還踩了一個(gè)很是腦殘的坑。一開始我想用復(fù)制構(gòu)造函數(shù)初始化b數(shù)組,然后就寫出了如下代碼:

D_array a,b;
a = b;

    實(shí)在是智障啊。。。錯(cuò)誤的原因是:創(chuàng)建b數(shù)組時(shí),通過默認(rèn)構(gòu)造函數(shù)初始化。然后再?zèng)]有釋放已分配的內(nèi)存空間情況下就直接又用復(fù)制構(gòu)造函數(shù)再一次初始化了b。所以在調(diào)用析構(gòu)函數(shù)時(shí),發(fā)生報(bào)錯(cuò)。    

    順便分享一篇很不錯(cuò)的文章:http://www.cnblogs.com/raichen/p/4752025.html  詳細(xì)介紹了C++復(fù)制構(gòu)造函數(shù),我是看了這篇文章才發(fā)現(xiàn)的錯(cuò)誤。


分享文章:C++實(shí)現(xiàn)的動(dòng)態(tài)數(shù)組
地址分享:http://weahome.cn/article/jogied.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部