發(fā)布于:2021-01-21 16:47:23
0
217
0
什么是動(dòng)態(tài)數(shù)組?
動(dòng)態(tài)數(shù)組與常規(guī)數(shù)組非常相似,但其大小在程序運(yùn)行時(shí)是可以修改的。數(shù)組元素占用連續(xù)的內(nèi)存塊。
一旦創(chuàng)建了數(shù)組,就不能更改其大小。但是,動(dòng)態(tài)數(shù)組是不同的。動(dòng)態(tài)數(shù)組可以在填充之后擴(kuò)展其大小。
在創(chuàng)建數(shù)組的過(guò)程中,它被分配了預(yù)定數(shù)量的內(nèi)存。動(dòng)態(tài)數(shù)組的情況并非如此,因?yàn)楫?dāng)需要時(shí),它會(huì)將其內(nèi)存大小增加一定的因子。
在這個(gè)C++教程中,你將學(xué)習(xí)什么是動(dòng)態(tài)數(shù)組?影響動(dòng)態(tài)數(shù)組性能的因素。
影響動(dòng)態(tài)陣列性能的因素
數(shù)組的初始大小及其增長(zhǎng)因子決定了它的性能。注意以下幾點(diǎn):
如果一個(gè)數(shù)組的大小和增長(zhǎng)因子都很小,它會(huì)更頻繁地重新分配內(nèi)存。這將降低陣列的性能。
如果一個(gè)數(shù)組的大小和增長(zhǎng)因子都很大,那么它將有大量未使用的內(nèi)存。因此,調(diào)整大小操作可能需要更長(zhǎng)的時(shí)間。這將降低陣列的性能。
新關(guān)鍵字
在C++中,我們可以使用新關(guān)鍵字創(chuàng)建動(dòng)態(tài)數(shù)組。要分配的項(xiàng)目數(shù)在一對(duì)方括號(hào)內(nèi)指定。類(lèi)型名稱(chēng)應(yīng)在其前面。將分配請(qǐng)求的項(xiàng)目數(shù)。
new關(guān)鍵字采用以下語(yǔ)法:
pointer_variable = new data_type;
指針變量是指針變量的名稱(chēng)。
數(shù)據(jù)類(lèi)型必須是一個(gè)有效的C++數(shù)據(jù)類(lèi)型。
關(guān)鍵字然后返回指向第一項(xiàng)的指針。創(chuàng)建動(dòng)態(tài)數(shù)組后,我們可以使用delete關(guān)鍵字將其刪除。
#includeusing namespace std;
int main() {
int x, n;
cout << "Enter the number of items:" << "n";
cin >>n;
int *arr = new int(n);
cout << "Enter " << n << " items" << endl;
for (x = 0; x < n; x++) {
cin >> arr[x];
}
cout << "You entered: ";
for (x = 0; x < n; x++) {
cout << arr[x] << " ";
}
return 0;
}
輸出:
以下是代碼截圖:
代碼說(shuō)明:
將iostream頭文件包含到我們的程序中以使用其功能。
在我們的程序中包含std名稱(chēng)空間,以便在不調(diào)用它的情況下使用它的類(lèi)。
調(diào)用main()函數(shù)。程序邏輯應(yīng)該添加到函數(shù)體中。
聲明兩個(gè)整數(shù)變量x和n。
在控制臺(tái)上打印一些文本,提示用戶(hù)輸入變量n的值。
從鍵盤(pán)讀取用戶(hù)輸入并將其分配給變量n。
聲明一個(gè)數(shù)組,以容納總共n個(gè)整數(shù),并將其分配給指針變量*arr。
打印一條消息,提示用戶(hù)輸入n個(gè)項(xiàng)目。
使用for循環(huán)創(chuàng)建循環(huán)變量x,以迭代用戶(hù)輸入的項(xiàng)。
讀取用戶(hù)輸入的元素并將它們存儲(chǔ)在for循環(huán)主體的數(shù)組arr中。
在控制臺(tái)上打印一些文本。
使用for循環(huán)創(chuàng)建循環(huán)變量x來(lái)迭代數(shù)組的項(xiàng)。
在控制臺(tái)上打印名為arr的數(shù)組中包含的值。
for循環(huán)主體的結(jié)尾。
程序成功完成后必須返回值。
main()函數(shù)主體的結(jié)尾。
注意:在上面的示例中,允許用戶(hù)在運(yùn)行時(shí)為數(shù)組指定任何大小。這意味著數(shù)組的大小是在運(yùn)行時(shí)確定的。
初始化動(dòng)態(tài)分配的陣列
將動(dòng)態(tài)數(shù)組初始化為0很容易。
語(yǔ)法:
int *array{ new int[length]{} };
在上述語(yǔ)法中,長(zhǎng)度表示要添加到數(shù)組中的元素?cái)?shù)。因?yàn)槲覀冃枰獙?shù)組初始化為0,所以應(yīng)該將其留空。
我們可以使用初始值設(shè)定項(xiàng)列表初始化動(dòng)態(tài)數(shù)組。讓我們創(chuàng)建一個(gè)示例來(lái)演示這一點(diǎn)。
#includeusing namespace std;
int main(void) {
int x;
int *array{ new int[5]{ 10, 7, 15, 3, 11 } };
cout << "Array elements: " << endl;
for (x = 0; x < 5; x++) {
cout << array[x] << endl;
}
return 0;
}
輸出:
以下是代碼截圖:
代碼說(shuō)明:
將iostream頭文件包含到我們的程序中以使用其功能。
在我們的程序中包含std名稱(chēng)空間,以便在不調(diào)用它的情況下使用它的類(lèi)。
調(diào)用main()函數(shù)。程序邏輯應(yīng)該添加到函數(shù)體中。
聲明名為x的整數(shù)變量。
使用初始值設(shè)定項(xiàng)列表聲明名為array的動(dòng)態(tài)數(shù)組。數(shù)組將包含5個(gè)整數(shù)元素。請(qǐng)注意,我們沒(méi)有在數(shù)組長(zhǎng)度和初始值設(shè)定項(xiàng)列表之間使用“=”運(yùn)算符。
在控制臺(tái)上打印一些文本。Endl是C++的關(guān)鍵字,意思是結(jié)束行。它將光標(biāo)移到下一個(gè)句子。
使用for循環(huán)迭代數(shù)組元素。
在控制臺(tái)上打印名為array的數(shù)組的內(nèi)容。
for循環(huán)主體的結(jié)尾。
程序成功完成后必須返回值。
main()函數(shù)主體的結(jié)尾。
調(diào)整數(shù)組大小
動(dòng)態(tài)數(shù)組的長(zhǎng)度是在分配時(shí)間內(nèi)設(shè)置的。
但是,C++在分配后沒(méi)有一個(gè)內(nèi)置的調(diào)整數(shù)組大小的機(jī)制。
但是,您可以通過(guò)動(dòng)態(tài)分配新數(shù)組、在元素上復(fù)制,然后刪除舊數(shù)組來(lái)克服此挑戰(zhàn)。
注意:這種技術(shù)很容易出錯(cuò),因此請(qǐng)盡量避免。
動(dòng)態(tài)刪除數(shù)組
一個(gè)動(dòng)態(tài)數(shù)組一旦達(dá)到目的就應(yīng)該從計(jì)算機(jī)內(nèi)存中刪除。delete語(yǔ)句可以幫助您實(shí)現(xiàn)這一點(diǎn)。釋放的內(nèi)存空間可以用來(lái)保存另一組數(shù)據(jù)。但是,即使您不從計(jì)算機(jī)內(nèi)存中刪除動(dòng)態(tài)數(shù)組,一旦程序終止,它也會(huì)自動(dòng)刪除。
注意:要從計(jì)算機(jī)內(nèi)存中刪除動(dòng)態(tài)數(shù)組,應(yīng)使用delete[],而不是delete。[]指示CPU刪除多個(gè)變量而不是一個(gè)變量。在處理動(dòng)態(tài)數(shù)組時(shí)使用delete而不是delete[]可能會(huì)導(dǎo)致問(wèn)題。這類(lèi)問(wèn)題的例子包括內(nèi)存泄漏、數(shù)據(jù)損壞、崩潰等。
#includeusing namespace std;
int main() {
int x, n;
cout << "How many numbers will you type?" << "n";
cin >>n;
int *arr = new int(n);
cout << "Enter " << n << " numbers" << endl;
for (x = 0; x < n; x++) {
cin >> arr[x];
}
cout << "You typed: ";
for (x = 0; x < n; x++) {
cout << arr[x] << " ";
}
cout << endl;
delete [] arr;
return 0;
}
輸出:
以下是代碼截圖:
代碼說(shuō)明:
在我們的程序中包含iostream頭文件以使用其功能。
在我們的程序中包含std名稱(chēng)空間,以便在不調(diào)用它的情況下使用它的類(lèi)。
調(diào)用main()函數(shù)。程序邏輯應(yīng)該添加到函數(shù)體中。
聲明整數(shù)數(shù)據(jù)類(lèi)型的兩個(gè)變量x和n。
在控制臺(tái)上打印一些文本。文本將要求用戶(hù)說(shuō)明他們將輸入的數(shù)字?jǐn)?shù)。
從鍵盤(pán)讀取用戶(hù)輸入。輸入值將分配給變量n。
聲明一個(gè)指針變量*arr。數(shù)組arr將保留一些內(nèi)存來(lái)存儲(chǔ)總共n個(gè)整數(shù)。
在控制臺(tái)上打印一條消息,提示用戶(hù)輸入n個(gè)數(shù)字。
創(chuàng)建for循環(huán)和循環(huán)變量x,以迭代用戶(hù)輸入的數(shù)字。
讀取用戶(hù)輸入的數(shù)字并將其存儲(chǔ)在for循環(huán)主體的數(shù)組arr中。
在控制臺(tái)上打印一些文本。
使用for循環(huán)和循環(huán)變量x迭代數(shù)組arr的內(nèi)容。
在控制臺(tái)上打印數(shù)組arr的值。
for循環(huán)主體的結(jié)尾。
在控制臺(tái)上打印空行。
釋放數(shù)組arr的內(nèi)存。
程序成功完成后將返回值。
main()函數(shù)主體的結(jié)尾。
總結(jié):
常規(guī)數(shù)組的大小是固定的。一旦聲明,就不能修改它們的大小。
對(duì)于這些類(lèi)型的數(shù)組,內(nèi)存大小在編譯時(shí)確定。
動(dòng)態(tài)數(shù)組是不同的。它們的大小可以在運(yùn)行時(shí)更改。
在動(dòng)態(tài)數(shù)組中,大小在運(yùn)行時(shí)確定。 > LI> C++中的動(dòng)態(tài)數(shù)組是用new關(guān)鍵字聲明的。
我們使用方括號(hào)指定要存儲(chǔ)在動(dòng)態(tài)數(shù)組中的項(xiàng)數(shù)。
處理完數(shù)組后,我們可以使用delete操作符釋放內(nèi)存。
使用帶[]的delete運(yùn)算符釋放所有數(shù)組元素的內(nèi)存。
不帶[]的刪除只釋放單個(gè)元素的內(nèi)存。 > LI>沒(méi)有內(nèi)置的機(jī)制來(lái)調(diào)整C++數(shù)組的大小。
要使用列表初始值設(shè)定項(xiàng)初始化數(shù)組,我們不使用“=”運(yùn)算符。
作者介紹
熱門(mén)博客推薦