Δυναμική κατανομή συστοιχιών με παράδειγμα

Πίνακας περιεχομένων:

Anonim

Τι είναι το Dynamic Array;

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

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

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

Σε αυτό το σεμινάριο C ++, θα μάθετε

  • Τι είναι το Dynamic Array;
  • Παράγοντες που επηρεάζουν την απόδοση των δυναμικών συστοιχιών
  • Η νέα λέξη-κλειδί
  • Αρχικοποίηση δυναμικά κατανεμημένων συστοιχιών
  • Αλλαγή μεγέθους συστοιχιών
  • Δυναμική διαγραφή συστοιχιών

Παράγοντες που επηρεάζουν την απόδοση των δυναμικών συστοιχιών

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

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

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

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

Σύνταξη:

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

pointer_variable = new data_type;

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

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

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

Παράδειγμα 1:

#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;}

Παραγωγή:

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

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

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

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

Αρχικοποίηση δυναμικά κατανεμημένων συστοιχιών

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

Σύνταξη:

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

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

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

Παράδειγμα 2:

#include 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 namespace στο πρόγραμμά μας για να χρησιμοποιήσετε τις τάξεις του χωρίς να το καλέσετε.
  3. Καλέστε την κύρια λειτουργία (). Η λογική του προγράμματος πρέπει να προστεθεί μέσα στο σώμα της συνάρτησης.
  4. Δηλώστε μια ακέραια μεταβλητή με το όνομα x.
  5. Δηλώστε έναν δυναμικό πίνακα με όνομα πίνακα χρησιμοποιώντας μια λίστα αρχικοποιητών. Ο πίνακας θα περιέχει 5 ακέραια στοιχεία. Λάβετε υπόψη ότι δεν χρησιμοποιήσαμε τον τελεστή μεταξύ του μήκους του πίνακα και της λίστας αρχικοποιητών.
  6. Εκτυπώστε λίγο κείμενο στην κονσόλα. Το endl είναι μια λέξη-κλειδί C ++ που σημαίνει τελική γραμμή. Μετακινεί τον κέρσορα στην επόμενη πρόταση.
  7. Χρησιμοποιήστε ένα για βρόχο για να επαναλάβετε τα στοιχεία του πίνακα.
  8. Εκτυπώστε τα περιεχόμενα του πίνακα που ονομάζεται πίνακας στην κονσόλα.
  9. Άκρο του σώματος του βρόχου για.
  10. Το πρόγραμμα πρέπει να επιστρέψει την τιμή μετά την επιτυχή ολοκλήρωση.
  11. Τέλος του σώματος της κύριας () συνάρτησης.

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

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

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

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

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

Δυναμική διαγραφή συστοιχιών

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

Σημείωση:

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

Παράδειγμα 3:

#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;}

Παραγωγή:

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

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

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

Περίληψη:

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