C++ Massiivide dünaamiline jaotamine näitega

⚡ Nutikas kokkuvõte

C++ Massiivi dünaamiline jaotamine selgitab, kuidas massiive kuhjast käitusajal eraldada, suurust muuta ja kustutada. LessNeed hõlmavad uusi mustreid, kustutamist[], initsialiseerimist, kopeerimist, suuruse muutmist ja turvalise mälu mustreid.

  • 🧠 Kuhja eraldamine: new int[size] loob massiive, mille suurus on käitusajal teada.
  • 🔁 Initsialiseerimine: new int[size](){} annab mälule nullid; sulgudes loendid määravad fikseeritud väärtused.
  • 📏 Suuruse muutmine: Eralda suurem, kopeeri käsuga std::copy ja seejärel kustuta vana puhver.
  • 🧹 Kustuta õigesti: Massiivide puhul kutsu alati delete[] funktsiooni; mitte kunagi lihtsalt delete funktsiooni.
  • 📦 Eelista std::vectorit: Kaasaegne C++ Eelistab vektori automaatset suuruse muutmist ja RAII-d.
  • 🤖 AI Revvaata: Tehisintellekti assistendid tuvastavad lekkeid ja pakuvad nutikaid näpunäiteid.

C++ Massiivide dünaamiline jaotamine

Mis on dünaamiline massiiv?

Dünaamiline massiiv on üsna sarnane tavalise massiiviga, kuid selle suurust saab programmi käitamise ajal muuta. DynamArray elemendid hõivavad külgneva mäluploki.

Kui massiiv on loodud, ei saa selle suurust muuta. Dünaamiline massiiv on aga erinev. Dünaamiline massiiv võib oma suurust laiendada isegi pärast selle täitmist.

Massiivi loomise ajal eraldatakse sellele etteantud mälumaht. Dünaamilise massiivi puhul see nii ei ole, kuna vajaduse korral suurendab see mälumahtu teatud teguri võrra.

Dünaamiliste massiivide toimivust mõjutavad tegurid

Massiivi esialgne suurus ja kasvutegur määravad selle jõudluse. Pange tähele järgmisi punkte:

  1. Kui massiivil on väike suurus ja väike kasvutegur, jaotab see mälu sagedamini ümber. See vähendab massiivi jõudlust.
  2. Kui massiivil on suur suurus ja suur kasvutegur, on sellel tohutu hulk kasutamata mälu. Seetõttu võivad suuruse muutmise toimingud võtta kauem aega. See vähendab massiivi jõudlust.

Uus märksõna

In C++, saame uue märksõna abil luua dünaamilise massiivi. Eraldatavate üksuste arv määratakse nurksulgudes. Tüübi nimi peaks sellele eelnema. Vajalik arv esemeid eraldatakse.

Süntaks

Uuel märksõnal on järgmine süntaks:

pointer_variable = new data_type;

Pointer_muutuja on nimi osuti muutuja.

Data_type peab olema kehtiv C++ andmetüüp.

Seejärel tagastab märksõna kursori esimesele üksusele. Pärast dünaamilise massiivi loomist saame selle kustutada märksõna kustutamise abil.

Näide 1:

#include<iostream>
using 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;
}

Väljund:

Uus märksõna

Siin on koodi ekraanipilt:

Uus märksõna

Code Selgitus:

  1. Kaasake iostreami päisefail selle kasutamiseks meie programmi funktsioonid.
  2. Lisage meie programmi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  3. Kutsuge funktsioon main(). Programmi loogika tuleks lisada funktsiooni kehasse.
  4. Deklareerige kaks täisarvu muutujat x ja n.
  5. Printige konsoolile tekst, mis palub kasutajal sisestada muutuja n väärtus.
  6. Lugege klaviatuurilt kasutaja sisendit ja määrake see muutujale n.
  7. Deklareerige massiiv nii, et see sisaldab kokku n täisarvu ja määrake see osuti muutujale *arr.
  8. Printige sõnum, milles palutakse kasutajal sisestada n arv üksusi.
  9. Kasutage for-tsüklit, et luua tsüklimuutuja x, et korrata kasutaja sisestatud üksusi.
  10. Lugege kasutaja sisestatud elemente ja salvestage need massiivi arr.
  11. Keha lõpp silmuse jaoks.
  12. Printige konsoolile teksti.
  13. Kasutage tsüklit for, et luua tsüklimuutuja x, et korrata massiivi üksusi.
  14. Printige välja väärtused, mis sisalduvad konsooli massiivis nimega arr.
  15. For-silmuse keha lõpp.
  16. Programm peab pärast edukat lõpetamist tagastama väärtuse.
  17. Funktsiooni main() keha lõpp.

MÄRKUS. Ülaltoodud näites on kasutajal lubatud käitamisajal määrata massiivi mis tahes suurus. See tähendab, et massiivi suurus määratakse käitusajal.

Dünaamiliselt eraldatud massiivide lähtestamine

Dünaamilise massiivi lähtestamine nulliks on lihtne.

süntaksit:

int *array{ new int[length]{} };

Ülaltoodud süntaksis tähistab pikkus massiivi lisatavate elementide arvu. Kuna peame massiivi lähtestama nulliks, tuleks see tühjaks jätta.

Dünaamilise massiivi saame lähtestada lähtestajate loendi abil. Loome näite, mis seda demonstreerib.

Näide 2:

#include <iostream>
using 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;
}

Väljund:

Dünaamiliselt eraldatud massiivide lähtestamine

Siin on koodi ekraanipilt:

Dünaamiliselt eraldatud massiivide lähtestamine

Code Selgitus:

  1. Selle funktsioonide kasutamiseks lisage meie programmi iostreami päisefail.
  2. Lisage meie programmi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  3. Kutsuge funktsioon main(). Programmi loogika tuleks lisada funktsiooni kehasse.
  4. Deklareerige täisarvuline muutuja nimega x.
  5. Deklareerige dünaamiline massiiv nimega massiiv, kasutades lähtestajate loendit. Massiivis on 5 täisarvu elementi. Pange tähele, et me ei ole kasutanud massiivi pikkuse ja lähtestajate loendi vahel operaatorit "=".
  6. Printige konsoolile teksti. Endl on a C++ märksõna, mis tähendab lõpprida. See viib kursori järgmisele lausele.
  7. Kasutage massiivi elementide kordamiseks tsüklit for.
  8. Printige konsoolile massiivi nimega massiiv sisu.
  9. For-silmuse keha lõpp.
  10. Programm peab pärast edukat lõpetamist tagastama väärtuse.
  11. Funktsiooni main() keha lõpp.

Massiivide suuruse muutmine

Dünaamilise massiivi pikkus määratakse jaotamisaja jooksul.

Kuid C++ ei ole sisseehitatud mehhanismi massiivi suuruse muutmiseks, kui see on eraldatud.

Selle väljakutse saate siiski ületada, eraldades dünaamiliselt uue massiivi, kopeerides elemendid üle ja kustutades seejärel vana massiivi.

Märkus: see tehnika on altid vigadele, seega proovige seda vältida.

Massiivide dünaamiline kustutamine

Dünaamiline massiiv tuleks arvuti mälust kustutada, kui selle eesmärk on täidetud. Kustutusavaldus aitab teil seda teha. Vabanenud mäluruumi saab seejärel kasutada teise andmekogumi hoidmiseks. Isegi kui te dünaamilist massiivi arvutimälust ei kustuta, kustutatakse see programmi lõppedes automaatselt.

Märge:

Dünaamilise massiivi arvutimälust kustutamiseks kasutage kustutamise asemel käsku delete[]. [] annab CPU-le korralduse kustutada ühe muutuja asemel mitu muutujat. Dünaamilise massiiviga tegelemisel käsu delete [] asemel kustutamine võib põhjustada probleeme. Selliste probleemide näideteks on mälulekked, andmete riknemine, kokkujooksmised jne.

Näide 3:

#include<iostream>
using 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;
}

Väljund:

Massiivide dünaamiline kustutamine

Siin on koodi ekraanipilt:

Massiivide dünaamiline kustutamine

Code Selgitus:

  1. Selle funktsioonide kasutamiseks lisage meie programmi iostreami päisefail.
  2. Lisage meie programmi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  3. Kutsuge funktsioon main(). Programmi loogika tuleks lisada funktsiooni kehasse.
  4. Deklareerige kaks täisarvulise andmetüübi muutujat x ja n.
  5. Printige konsoolile teksti. Tekst palub kasutajal märkida sisestatavate numbrite arv.
  6. Lugege klaviatuurilt kasutaja sisendit. Sisendväärtus määratakse muutujale n.
  7. Deklareerib kursori muutuja *arr. Massiivi arr reserveerib natuke mälu, et salvestada kokku n täisarvu.
  8. Printige konsoolile sõnum, mis palub kasutajal sisestada n numbrit.
  9. Loo for-silmus ja tsüklimuutuja x, et korrata kasutaja sisestatud numbreid.
  10. Lugege kasutaja sisestatud numbreid ja salvestage need massiivi arr.
  11. For-silmuse keha lõpp.
  12. Printige konsoolile teksti.
  13. Massiivi arr sisu kordamiseks kasutage tsüklit for ja tsüklimuutujat x.
  14. Printige konsoolil välja massiivi arr väärtused.
  15. For-silmuse keha lõpp.
  16. Printige konsoolile tühi rida.
  17. Vabastage massiivi arr mälu.
  18. Programm tagastab väärtuse, kui see on edukalt lõpule viidud.
  19. Funktsiooni main() keha lõpp.

KKK

Staatiliste massiivide suurus kompileerimise ajal pinus. Dünaamiliste massiivide suurus käitusajal heapis.

Tehisintellekti tööriistad tuvastavad lekkeid, puuduvaid delete[] märke ja pakuvad välja unique_ptr või vektori asendusi.

Jah. Copilot refaktoreerib toored uued ja kustutatud käsud std::vectoriks või nutikateks pointeriteks.

Eralda suurem, kopeeri std::copy abil, kustuta vana puhver[] abil või kasuta std::vectorit.

delete[] käivitab destruktorid ja vabastab ploki. Lihtne kustutamine massiivides on defineerimata käitumine.

Kasuta seda vaikimisi. See haldab mälu, toetab suuruse muutmist, vahemiku tsükleid ja erandeid turvaliselt.

Ei. SyncThroniseerige eraldamist, juurdepääsu ja kustutamist mutexide või aatomite abil.

Kasutage std::vectorit või std::unique_ptr-i käsitsi kustutamise vältimiseks[].

Võta see postitus kokku järgmiselt: