91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++實現的動態數組

發布時間:2020-06-11 16:58:47 來源:網絡 閱讀:1181 作者:pasilo 欄目:編程語言

    第一次寫博客,好緊張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);//流插入運算符重載
	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++復制構造函數,我是看了這篇文章才發現的錯誤。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

个旧市| 广宗县| 德保县| 修文县| 壤塘县| 古丈县| 长乐市| 六安市| 双城市| 邢台县| 贵德县| 揭西县| 昆山市| 旺苍县| 锡林浩特市| 江源县| 华宁县| 廊坊市| 宜州市| 汉沽区| 安仁县| 榆中县| 邛崃市| 华池县| 葫芦岛市| 鄂州市| 隆德县| 姜堰市| 苍梧县| 华坪县| 子长县| 棋牌| 酒泉市| 华亭县| 库尔勒市| 玛沁县| 建水县| 铜陵市| 盘锦市| 册亨县| 珠海市|