C++ Δυναμική κατανομή πινάκων με Παράδειγμα

Τι είναι ένας Δυναμικός Πίνακας;

Ένας δυναμικός πίνακας είναι αρκετά παρόμοιος με έναν κανονικό πίνακα, αλλά το μέγεθός του μπορεί να τροποποιηθεί κατά τη διάρκεια του χρόνου εκτέλεσης του προγράμματος. Τα στοιχεία DynamArray καταλαμβάνουν ένα συνεχόμενο μπλοκ μνήμης.

Μόλις δημιουργηθεί ένας πίνακας, το μέγεθός του δεν μπορεί να αλλάξει. Ωστόσο, ένας δυναμικός πίνακας είναι διαφορετικός. Ένας δυναμικός πίνακας μπορεί να επεκτείνει το μέγεθός του ακόμα και μετά την πλήρωσή του.

Κατά τη δημιουργία ενός πίνακα, του εκχωρείται μια προκαθορισμένη ποσότητα μνήμης. Αυτό δεν συμβαίνει με έναν δυναμικό πίνακα, καθώς μεγαλώνει το μέγεθος της μνήμης του κατά έναν συγκεκριμένο παράγοντα όταν υπάρχει ανάγκη.

Παράγοντες που επηρεάζουν την απόδοση των Dynamic Arrays

Το αρχικό μέγεθος του πίνακα και ο παράγοντας ανάπτυξής του καθορίζουν την απόδοσή του. Σημειώστε τα ακόλουθα σημεία:

  1. Εάν μια συστοιχία έχει μικρό μέγεθος και μικρό παράγοντα ανάπτυξης, θα συνεχίσει να ανακατανέμει τη μνήμη πιο συχνά. Αυτό θα μειώσει την απόδοση του πίνακα.
  2. Εάν ένας πίνακας έχει μεγάλο μέγεθος και μεγάλο παράγοντα ανάπτυξης, θα έχει ένα τεράστιο κομμάτι αχρησιμοποίητης μνήμης. Εξαιτίας αυτού, οι λειτουργίες αλλαγής μεγέθους ενδέχεται να διαρκέσουν περισσότερο. Αυτό θα μειώσει την απόδοση του πίνακα.

Η νέα λέξη-κλειδί

In C++, μπορούμε να δημιουργήσουμε έναν δυναμικό πίνακα χρησιμοποιώντας τη νέα λέξη-κλειδί. Ο αριθμός των στοιχείων που θα εκχωρηθούν καθορίζεται μέσα σε ένα ζεύγος αγκύλων. Το όνομα του τύπου πρέπει να προηγείται αυτού. Θα κατανεμηθεί ο ζητούμενος αριθμός ειδών.

Σύνταξη

Η νέα λέξη-κλειδί έχει την ακόλουθη σύνταξη:

pointer_variable = new data_type;

Το pointer_variable είναι το όνομα του μεταβλητή δείκτη.

Ο τύπος_δεδομένων πρέπει να είναι έγκυρος C++ τύπου δεδομένων.

Στη συνέχεια, η λέξη-κλειδί επιστρέφει έναν δείκτη στο πρώτο στοιχείο. Αφού δημιουργήσουμε τον δυναμικό πίνακα, μπορούμε να τον διαγράψουμε χρησιμοποιώντας τη λέξη-κλειδί διαγραφή.

Παράδειγμα 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;
}

Παραγωγή:

Η νέα λέξη-κλειδί

Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:

Η νέα λέξη-κλειδί

Επεξήγηση κώδικα:

  1. Συμπεριλάβετε το αρχείο κεφαλίδας iostream στο πρόγραμμά μας για να το χρησιμοποιήσετε λειτουργίες.
  2. Συμπεριλάβετε τον χώρο ονομάτων std στο πρόγραμμά μας για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
  3. Καλέστε τη συνάρτηση main(). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα της συνάρτησης.
  4. Δηλώστε δύο ακέραιες μεταβλητές x και n.
  5. Εκτυπώστε κάποιο κείμενο στην κονσόλα που ζητά από τον χρήστη να εισαγάγει την τιμή της μεταβλητής n.
  6. Διαβάστε τα δεδομένα χρήστη από το πληκτρολόγιο και αντιστοιχίστε τα στη μεταβλητή n.
  7. Δηλώστε έναν πίνακα ώστε να περιέχει συνολικά n ακέραιους αριθμούς και να τον αντιστοιχίσετε στη μεταβλητή δείκτη *arr.
  8. Εκτυπώστε ένα μήνυμα που ζητά από τον χρήστη να εισαγάγει n αριθμό στοιχείων.
  9. Χρησιμοποιήστε έναν βρόχο for για να δημιουργήσετε μια μεταβλητή βρόχου x για να επαναλάβετε τα στοιχεία που εισάγει ο χρήστης.
  10. Διαβάστε τα στοιχεία που εισήγαγε ο χρήστης και αποθηκεύστε τα στον πίνακα πίνακα.
  11. Τέλος του σώματος του για βρόχο.
  12. Εκτυπώστε λίγο κείμενο στην κονσόλα.
  13. Χρησιμοποιήστε έναν βρόχο for για να δημιουργήσετε μια μεταβλητή βρόχου x για επανάληψη πάνω από τα στοιχεία του πίνακα.
  14. Εκτυπώστε τις τιμές που περιέχονται στον πίνακα με το όνομα arr στην κονσόλα.
  15. Τέλος του σώματος του βρόχου for.
  16. Το πρόγραμμα πρέπει να επιστρέψει τιμή μετά την επιτυχή ολοκλήρωση.
  17. Τέλος του σώματος της συνάρτησης main().

ΣΗΜΕΙΩΣΗ: Στο παραπάνω παράδειγμα, ο χρήστης επιτρέπεται να καθορίσει οποιοδήποτε μέγεθος για τον πίνακα κατά τη διάρκεια του χρόνου εκτέλεσης. Αυτό σημαίνει ότι το μέγεθος του πίνακα καθορίζεται κατά τη διάρκεια του χρόνου εκτέλεσης.

Εκκίνηση δυναμικά κατανεμημένων πινάκων

Είναι εύκολο να αρχικοποιήσετε έναν δυναμικό πίνακα στο 0.

Σύνταξη:

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

Στην παραπάνω σύνταξη, το μήκος υποδηλώνει τον αριθμό των στοιχείων που πρέπει να προστεθούν στον πίνακα. Εφόσον πρέπει να αρχικοποιήσουμε τον πίνακα στο 0, αυτό θα πρέπει να μείνει κενό.

Μπορούμε να αρχικοποιήσουμε έναν δυναμικό πίνακα χρησιμοποιώντας μια λίστα αρχικοποιητών. Ας δημιουργήσουμε ένα παράδειγμα που το αποδεικνύει αυτό.

Παράδειγμα 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;
}

Παραγωγή:

Εκκίνηση δυναμικά κατανεμημένων πινάκων

Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:

Εκκίνηση δυναμικά κατανεμημένων πινάκων

Επεξήγηση κώδικα:

  1. Συμπεριλάβετε το αρχείο κεφαλίδας iostream στο πρόγραμμά μας για να χρησιμοποιήσετε τις λειτουργίες του.
  2. Συμπεριλάβετε τον χώρο ονομάτων std στο πρόγραμμά μας για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
  3. Καλέστε τη συνάρτηση main(). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα της συνάρτησης.
  4. Δηλώστε μια ακέραια μεταβλητή με το όνομα x.
  5. Δηλώστε έναν δυναμικό πίνακα με το όνομα πίνακας χρησιμοποιώντας μια λίστα αρχικοποιητή. Ο πίνακας θα περιέχει 5 ακέραια στοιχεία. Σημειώστε ότι δεν έχουμε χρησιμοποιήσει τον τελεστή "=" μεταξύ του μήκους του πίνακα και της λίστας αρχικοποιητή.
  6. Εκτυπώστε λίγο κείμενο στην κονσόλα. Το endl είναι α C++ λέξη-κλειδί που σημαίνει τελική γραμμή. Μετακινεί τον κέρσορα στην επόμενη πρόταση.
  7. Χρησιμοποιήστε έναν βρόχο for για να επαναλάβετε τα στοιχεία του πίνακα.
  8. Εκτυπώστε τα περιεχόμενα του πίνακα με το όνομα array στην κονσόλα.
  9. Τέλος του σώματος του βρόχου for.
  10. Το πρόγραμμα πρέπει να επιστρέψει τιμή μετά την επιτυχή ολοκλήρωση.
  11. Τέλος του σώματος της συνάρτησης main().

Αλλαγή μεγέθους συστοιχιών

Το μήκος ενός δυναμικού πίνακα ορίζεται κατά τη διάρκεια του χρόνου εκχώρησης.

Ωστόσο, η C++ δεν έχει ενσωματωμένο μηχανισμό αλλαγής του μεγέθους ενός πίνακα αφού έχει εκχωρηθεί.

Μπορείτε, ωστόσο, να ξεπεράσετε αυτήν την πρόκληση εκχωρώντας έναν νέο πίνακα δυναμικά, αντιγράφοντας τα στοιχεία και, στη συνέχεια, διαγράφοντας τον παλιό πίνακα.

Σημείωση: ότι αυτή η τεχνική είναι επιρρεπής σε σφάλματα, επομένως, προσπαθήστε να την αποφύγετε.

Δυναμική διαγραφή πινάκων

Ένας δυναμικός πίνακας θα πρέπει να διαγραφεί από τη μνήμη του υπολογιστή μόλις εκπληρωθεί ο σκοπός του. Η δήλωση διαγραφής μπορεί να σας βοηθήσει να το πετύχετε. Ο αποδεσμευμένος χώρος μνήμης μπορεί στη συνέχεια να χρησιμοποιηθεί για τη διατήρηση ενός άλλου συνόλου δεδομένων. Ωστόσο, ακόμα κι αν δεν διαγράψετε τη δυναμική συστοιχία από τη μνήμη του υπολογιστή, θα διαγραφεί αυτόματα μόλις τερματιστεί το πρόγραμμα.

Σημείωση:

Για να διαγράψετε έναν δυναμικό πίνακα από τη μνήμη του υπολογιστή, θα πρέπει να χρησιμοποιήσετε το delete[], αντί για το delete. Το [] δίνει εντολή στην CPU να διαγράψει πολλές μεταβλητές αντί για μία μεταβλητή. Η χρήση του delete αντί του delete[] όταν ασχολείται με έναν δυναμικό πίνακα μπορεί να οδηγήσει σε προβλήματα. Παραδείγματα τέτοιων προβλημάτων περιλαμβάνουν διαρροές μνήμης, καταστροφή δεδομένων, σφάλματα κ.λπ.

Παράδειγμα 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;
}

Παραγωγή:

Δυναμική διαγραφή πινάκων

Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:

Δυναμική διαγραφή πινάκων

Επεξήγηση κώδικα:

  1. Συμπεριλάβετε το αρχείο κεφαλίδας iostream στο πρόγραμμά μας για να χρησιμοποιήσετε τις λειτουργίες του.
  2. Συμπεριλάβετε τον χώρο ονομάτων std στο πρόγραμμά μας για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
  3. Καλέστε τη συνάρτηση main(). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα της συνάρτησης.
  4. Δηλώστε δύο μεταβλητές x και n του ακέραιου τύπου δεδομένων.
  5. Εκτυπώστε λίγο κείμενο στην κονσόλα. Το κείμενο θα ζητήσει από τον χρήστη να δηλώσει τον αριθμό των αριθμών που θα εισαγάγει.
  6. Διαβάστε τα δεδομένα χρήστη από το πληκτρολόγιο. Η τιμή εισόδου θα εκχωρηθεί στη μεταβλητή n.
  7. Δηλώστε μια μεταβλητή δείκτη *arr. Ο πίνακας arr θα κρατήσει κάποια μνήμη για να αποθηκεύσει συνολικά n ακέραιους αριθμούς.
  8. Εκτυπώστε ένα μήνυμα στην κονσόλα που ζητά από τον χρήστη να εισαγάγει n αριθμούς.
  9. Δημιουργήστε έναν βρόχο for και τη μεταβλητή βρόχου x για επανάληψη πάνω από τους αριθμούς που εισάγει ο χρήστης.
  10. Διαβάστε τους αριθμούς που εισήγαγε ο χρήστης και αποθηκεύστε τους στον πίνακα πίνακα.
  11. Τέλος του σώματος του βρόχου for.
  12. Εκτυπώστε λίγο κείμενο στην κονσόλα.
  13. Χρησιμοποιήστε έναν βρόχο for και τη μεταβλητή του βρόχου x για να επαναλάβετε τα περιεχόμενα του πίνακα arr.
  14. Εκτυπώστε τις τιμές του πίνακα arr στην κονσόλα.
  15. Τέλος του σώματος του βρόχου for.
  16. Εκτυπώστε μια κενή γραμμή στην κονσόλα.
  17. Απελευθερώστε τη μνήμη του πίνακα πίνακα.
  18. Το πρόγραμμα θα επιστρέψει τιμή όταν ολοκληρωθεί με επιτυχία.
  19. Τέλος του σώματος της συνάρτησης main().

Περίληψη

  • Οι κανονικοί πίνακες έχουν σταθερό μέγεθος. Δεν μπορείτε να τροποποιήσετε το μέγεθός τους αφού δηλωθεί.
  • Με αυτούς τους τύπους συστοιχιών, το μέγεθος της μνήμης καθορίζεται κατά τη διάρκεια του χρόνου μεταγλώττισης.
  • Οι δυναμικοί πίνακες είναι διαφορετικοί. Τα μεγέθη τους μπορούν να αλλάξουν κατά τη διάρκεια του χρόνου εκτέλεσης.
  • Στους δυναμικούς πίνακες, το μέγεθος καθορίζεται κατά τη διάρκεια του χρόνου εκτέλεσης.
  • Δυναμικοί πίνακες σε C++ δηλώνονται χρησιμοποιώντας τη νέα λέξη-κλειδί.
  • Χρησιμοποιούμε αγκύλες για να καθορίσουμε τον αριθμό των στοιχείων που θα αποθηκευτούν στον δυναμικό πίνακα.
  • Μόλις τελειώσουμε με τον πίνακα, μπορούμε να ελευθερώσουμε τη μνήμη χρησιμοποιώντας τον τελεστή διαγραφής.
  • Χρησιμοποιήστε τον τελεστή διαγραφής με [] για να ελευθερώσετε τη μνήμη όλων των στοιχείων πίνακα.
  • Μια διαγραφή χωρίς [] ελευθερώνει τη μνήμη ενός μόνο στοιχείου.
  • Δεν υπάρχει ενσωματωμένος μηχανισμός για αλλαγή μεγέθους C++ συστοιχίες.
  • Για να αρχικοποιήσουμε έναν πίνακα χρησιμοποιώντας έναν αρχικοποιητή λίστας, δεν χρησιμοποιούμε τον τελεστή "=".

Συνοψίστε αυτήν την ανάρτηση με: