std::list in C++ με Παράδειγμα
⚡ Έξυπνη Σύνοψη
std::list in C++ είναι ένα κοντέινερ ακολουθίας που υλοποιείται ως διπλά συνδεδεμένη λίστα, επιτρέποντας γρήγορη εισαγωγή και διαγραφή σε οποιαδήποτε θέση, ενώ αποθηκεύει στοιχεία σε μη συνεχόμενη μνήμη και υποστηρίζει αμφίδρομη διαδοχική πρόσβαση αντί για τυχαία πρόσβαση.

Τι είναι το std::list;
In C++, το std::list αναφέρεται σε ένα κοντέινερ αποθήκευσης. Το std::list σάς επιτρέπει να εισάγετε και να αφαιρείτε στοιχεία από οπουδήποτε. Το std::list υλοποιείται ως διπλά συνδεδεμένη λίστα. Αυτό σημαίνει ότι τα δεδομένα της λίστας είναι προσβάσιμα αμφίδρομα και διαδοχικά.
Η λίστα της Βασικής Βιβλιοθήκης Προτύπων δεν υποστηρίζει γρήγορη τυχαία πρόσβαση, αλλά υποστηρίζει διαδοχική πρόσβαση από όλες τις κατευθύνσεις.
Μπορείτε να διασκορπίσετε στοιχεία λίστας σε διαφορετικά κομμάτια μνήμης. Οι πληροφορίες που απαιτούνται για τη διαδοχική πρόσβαση στα δεδομένα αποθηκεύονται σε ένα κοντέινερ. Η λίστα std:: μπορεί να επεκταθεί και να συρρικνωθεί και από τα δύο άκρα όπως απαιτείται κατά τη διάρκεια του χρόνου εκτέλεσης. Ένας εσωτερικός κατανεμητής πληροί αυτόματα τις απαιτήσεις αποθήκευσης.
Αυτά τα χαρακτηριστικά εγείρουν ένα πρακτικό ερώτημα: πότε πρέπει πραγματικά να αναζητήσετε μια λίστα;
Γιατί να χρησιμοποιήσετε το std::list;
Ακολουθούν οι λόγοι για τη χρήση του std::list:
- Το std::list αποδίδει καλύτερα σε σύγκριση με άλλα κοντέινερ ακολουθίας όπως ο πίνακας και το διάνυσμα.
- Έχουν καλύτερη απόδοση στην εισαγωγή, την κίνηση και την εξαγωγή.tracστοιχεία από οποιαδήποτε θέση.
- Το std::list τα πάει καλύτερα με αλγόριθμους που εκτελούν εντατικά τέτοιες λειτουργίες.
Με σαφείς τους λόγους, το επόμενο βήμα είναι η σύνταξη που δηλώνει ένα.
Σύνταξη λίστας
Για να ορίσουμε τη λίστα std:: πρέπει να εισάγουμε το αρχείο κεφαλίδας. Εδώ είναι η σύνταξη ορισμού std::list:
template < class Type, class Alloc =allocator<T> > class list;
Ακολουθεί μια περιγραφή των παραπάνω παραμέτρων:
- T – Ορίζει τον τύπο του στοιχείου που περιέχεται. Μπορείτε να αντικαταστήσετε το T με οποιονδήποτε τύπο δεδομένων, ακόμα και με τύπους που ορίζονται από τον χρήστη.
- Alloc – Ορίζει τον τύπο του αντικειμένου allocator. Αυτό χρησιμοποιεί το πρότυπο κλάσης allocator από προεπιλογή. Εξαρτάται από την τιμή και χρησιμοποιεί ένα απλό μοντέλο κατανομής μνήμης.
Παράδειγμα 1
#include <algorithm> #include <iostream> #include <list> int main() { std::list<int> my_list = { 12, 5, 10, 9 }; for (int x : my_list) { std::cout << x << '\n'; } }
Παραγωγή:
Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:
Code Επεξήγηση:
- Συμπεριλάβετε το αρχείο κεφαλίδας αλγορίθμου για να χρησιμοποιήσετε τις συναρτήσεις του.
- Συμπεριλάβετε το αρχείο κεφαλίδας iostream για να χρησιμοποιήσετε τις λειτουργίες του.
- Συμπεριλάβετε το αρχείο κεφαλίδας λίστας για να χρησιμοποιήσετε τις λειτουργίες του.
- Καλέστε τη συνάρτηση main(). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα αυτής της συνάρτησης.
- Δημιουργήστε μια λίστα με το όνομα my_list με ένα σύνολο 4 ακεραίων.
- Χρήση για βρόχο για να δημιουργήσετε μια μεταβλητή βρόχου x. Αυτή η μεταβλητή θα χρησιμοποιηθεί για την επανάληψη των στοιχείων της λίστας.
- Εκτυπώστε τις τιμές της λίστας στην κονσόλα.
- Τέλος του σώματος του βρόχου for.
- Τέλος του σώματος της συνάρτησης main().
C++ Λειτουργίες λίστας
Εδώ είναι οι κοινές συναρτήσεις std::list:
| Λειτουργία | Περιγραφή |
|---|---|
| εισάγετε() | Αυτή η συνάρτηση εισάγει ένα νέο στοιχείο πριν από τη θέση που δείχνει ο επαναλήπτης. |
| push_back() | Αυτή η λειτουργία προσθέτει ένα νέο στοιχείο στο τέλος της λίστας. |
| push_front() | Προσθέτει ένα νέο στοιχείο στο μπροστινό μέρος της λίστας. |
| pop_front() | Διαγράφει το πρώτο στοιχείο της λίστας. |
| Μέγεθος() | Αυτή η συνάρτηση καθορίζει τον αριθμό των στοιχείων της λίστας. |
| εμπρός() | Καθορίζει τα πρώτα στοιχεία της λίστας. |
| πίσω() | To καθορίζει το τελευταίο στοιχείο της λίστας. |
| ΑΝΤΙΣΤΡΟΦΗ() | Αντιστρέφει τα στοιχεία της λίστας. |
| συγχώνευση() | Συγχωνεύει δύο ταξινομημένες λίστες. |
Κατασκευαστές
Εδώ είναι η λίστα των λειτουργίες παρέχεται από το αρχείο κεφαλίδας:
- Προεπιλεγμένος κατασκευαστής std::list::list()- Δημιουργεί μια κενή λίστα, αυτή, με μηδενικά στοιχεία.
- Συμπληρώστε τον κατασκευαστή std::list::list()- Δημιουργεί μια λίστα με n στοιχεία και εκχωρεί μια τιμή μηδέν (0) σε κάθε στοιχείο.
- Κατασκευαστής εύρους std::list::list()- δημιουργεί μια λίστα με πολλά στοιχεία στην περιοχή από το πρώτο έως το τελευταίο.
- Αντιγραφή κατασκευαστή std::list::list()- Δημιουργεί μια λίστα με ένα αντίγραφο κάθε στοιχείου που περιέχεται στην υπάρχουσα λίστα.
- Move constructor std::list::list()- δημιουργεί μια λίστα με τα στοιχεία μιας άλλης λίστας χρησιμοποιώντας τη σημασιολογία κίνησης.
- Κατασκευαστής λίστας Initializer std::list::list()-Δημιουργεί μια λίστα με τα στοιχεία μιας άλλης λίστας χρησιμοποιώντας τη σημασιολογία κίνησης.
Παράδειγμα 2
#include <iostream> #include <list> using namespace std; int main(void) { list<int> l; list<int> l1 = { 10, 20, 30 }; list<int> l2(l1.begin(), l1.end()); list<int> l3(move(l1)); cout << "Size of list l: " << l.size() << endl; cout << "List l2 contents: " << endl; for (auto it = l2.begin(); it != l2.end(); ++it) cout << *it << endl; cout << "List l3 contents: " << endl; for (auto it = l3.begin(); it != l3.end(); ++it) cout << *it << endl; return 0; }
Παραγωγή:
Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:
Code Επεξήγηση:
- Συμπεριλάβετε το αρχείο κεφαλίδας iostream για να χρησιμοποιήσετε τις λειτουργίες του.
- Συμπεριλάβετε το αρχείο κεφαλίδας λίστας για να χρησιμοποιήσετε τις λειτουργίες του.
- Συμπεριλάβετε τον χώρο ονομάτων std στον κώδικα για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
- Καλέστε τη συνάρτηση main(). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα αυτής της συνάρτησης.
- Δημιουργήστε μια κενή λίστα με το όνομα l.
- Δημιουργήστε μια λίστα με το όνομα l1 με ένα σύνολο 3 ακεραίων.
- Δημιουργήστε μια λίστα με το όνομα l2 με όλα τα στοιχεία της λίστας με το όνομα l1, από την αρχή μέχρι το τέλος.
- Δημιουργήστε μια λίστα με το όνομα l3 χρησιμοποιώντας τη σημασιολογία κίνησης. Η λίστα l3 θα έχει τα ίδια περιεχόμενα με τη λίστα l2.
- Εκτυπώστε το μέγεθος της λίστας με το όνομα l στην κονσόλα μαζί με άλλο κείμενο.
- Εκτυπώστε λίγο κείμενο στην κονσόλα.
- Δημιουργήστε έναν επαναλήπτη με το όνομά του και χρησιμοποιήστε τον για να επαναλάβετε τα στοιχεία της λίστας με το όνομα l2.
- Εκτυπώστε τα στοιχεία της λίστας με το όνομα l2 στην κονσόλα.
- Εκτυπώστε λίγο κείμενο στην κονσόλα.
- Δημιουργήστε έναν επαναλήπτη με το όνομά του και χρησιμοποιήστε τον για να επαναλάβετε τα στοιχεία της λίστας με το όνομα l3.
- Εκτυπώστε τα στοιχεία της λίστας με το όνομα l3 στην κονσόλα.
- Το πρόγραμμα πρέπει να επιστρέψει τιμή μετά την επιτυχή ολοκλήρωση.
- Τέλος του σώματος της συνάρτησης main().
Ιδιότητες κοντέινερ
Ακολουθεί η λίστα με τις ιδιότητες του κοντέινερ:
| Ιδιοκτησία | Περιγραφή |
|---|---|
| Ακολουθία | Τα δοχεία ακολουθίας ταξινομούν τα στοιχεία τους σε μια αυστηρή γραμμική ακολουθία. Τα στοιχεία είναι προσβάσιμα από τη θέση τους στην ακολουθία. |
| Λίστα με διπλή σύνδεση | Κάθε στοιχείο έχει πληροφορίες για τον εντοπισμό προηγούμενων και επόμενων στοιχείων. Αυτό επιτρέπει σταθερό χρόνο για τις λειτουργίες εισαγωγής και διαγραφής. |
| Ενημερωμένος κατανεμητής | Ένα αντικείμενο κατανομής χρησιμοποιείται για την δυναμική τροποποίηση του μεγέθους αποθήκευσης. |
Εισαγωγή σε λίστα
Υπάρχουν διαφορετικές συναρτήσεις που μπορούμε να χρησιμοποιήσουμε για να εισάγουμε τιμές σε μια λίστα. Ας το δείξουμε αυτό:
Παράδειγμα 3
#include <algorithm> #include <iostream> #include <list> int main() { std::list<int> my_list = { 12, 5, 10, 9 }; my_list.push_front(11); my_list.push_back(18); auto it = std::find(my_list.begin(), my_list.end(), 10); if (it != my_list.end()) { my_list.insert(it, 21); } for (int x : my_list) { std::cout << x << '\n'; } }
Παραγωγή:
Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:
Code Επεξήγηση:
- Συμπεριλάβετε το αρχείο κεφαλίδας αλγορίθμου για να χρησιμοποιήσετε τις συναρτήσεις του.
- Συμπεριλάβετε το αρχείο κεφαλίδας iostream για να χρησιμοποιήσετε τις λειτουργίες του.
- Συμπεριλάβετε το αρχείο κεφαλίδας λίστας για να χρησιμοποιήσετε τις λειτουργίες του.
- Καλέστε τη συνάρτηση main(). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα αυτής της συνάρτησης.
- Δημιουργήστε μια λίστα με το όνομα my_list με ένα σύνολο 4 ακεραίων.
- Εισαγάγετε το στοιχείο 11 στο μπροστινό μέρος της λίστας με το όνομα my_list.
- Εισαγάγετε το στοιχείο 18 στο τέλος της λίστας με το όνομα my_list.
- Δημιουργήστε έναν επαναλήπτη και χρησιμοποιήστε τον για να βρείτε το στοιχείο 10 από τη λίστα my_list.
- Χρησιμοποιήστε μια δήλωση if για να προσδιορίσετε εάν το παραπάνω στοιχείο βρέθηκε ή όχι.
- Εισαγάγετε το στοιχείο 21 πριν από το παραπάνω στοιχείο εάν βρέθηκε.
- Τέλος του σώματος της δήλωσης if.
- Χρησιμοποιήστε έναν βρόχο for για να δημιουργήσετε μια μεταβλητή βρόχου x. Αυτή η μεταβλητή θα χρησιμοποιηθεί για επανάληψη πάνω από τα στοιχεία της λίστας.
- Εκτυπώστε τις τιμές της λίστας στην κονσόλα.
- Τέλος του σώματος του βρόχου for.
- Τέλος του σώματος της συνάρτησης main().
Τα στοιχεία που περιλαμβάνονται σε μια λίστα μπορούν εξίσου εύκολα να αφαιρεθούν.
Διαγραφή από λίστα
Είναι δυνατή η διαγραφή στοιχείων από μια λίστα. Η συνάρτηση erase() σάς επιτρέπει να διαγράψετε ένα στοιχείο ή μια περιοχή στοιχείων από μια λίστα.
- Για να διαγράψετε ένα μεμονωμένο στοιχείο, περνάτε απλώς μια θέση ακέραιου αριθμού. Το στοιχείο θα διαγραφεί.
- Για να διαγράψετε ένα εύρος, περνάτε τον αρχικό και τον τελικό επαναλήπτη. Ας το δείξουμε αυτό.
Παράδειγμα 4
#include <algorithm> #include <iostream> #include <list> using namespace std; int main() { std::list<int> my_list = { 12, 5, 10, 9 }; cout << "List elements before deletion: "; for (int x : my_list) { std::cout << x << '\n'; } list<int>::iterator i = my_list.begin(); my_list.erase(i); cout << "\nList elements after deletion: "; for (int x : my_list) { std::cout << x << '\n'; } return 0; }
Παραγωγή:
Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:
Code Επεξήγηση:
- Συμπεριλάβετε το αρχείο κεφαλίδας αλγορίθμου για να χρησιμοποιήσετε τις συναρτήσεις του.
- Συμπεριλάβετε το αρχείο κεφαλίδας iostream για να χρησιμοποιήσετε τις λειτουργίες του.
- Συμπεριλάβετε το αρχείο κεφαλίδας λίστας για να χρησιμοποιήσετε τις λειτουργίες του.
- Συμπεριλάβετε τον χώρο ονομάτων std στο πρόγραμμά μας για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
- Καλέστε τη συνάρτηση main(). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα αυτής της συνάρτησης.
- Δημιουργήστε μια λίστα με το όνομα my_list με ένα σύνολο 4 ακεραίων.
- Εκτυπώστε λίγο κείμενο στην κονσόλα.
- Χρησιμοποιήστε έναν βρόχο for για να δημιουργήσετε μια μεταβλητή βρόχου x. Αυτή η μεταβλητή θα χρησιμοποιηθεί για επανάληψη πάνω από τα στοιχεία της λίστας.
- Εκτυπώστε τις τιμές της λίστας στην κονσόλα.
- Τέλος του σώματος του βρόχου for.
- Δημιουργήστε έναν επαναλήπτη i που να οδηγεί στο πρώτο στοιχείο της λίστας.
- Χρησιμοποιήστε τη συνάρτηση erase() που επισημαίνεται από τον επαναλήπτη i.
- Εκτυπώστε λίγο κείμενο στην κονσόλα.
- Χρησιμοποιήστε έναν βρόχο for για να δημιουργήσετε μια μεταβλητή βρόχου x. Αυτή η μεταβλητή θα χρησιμοποιηθεί για επανάληψη πάνω από τα στοιχεία της λίστας.
- Εκτυπώστε τις τιμές της λίστας στην κονσόλα. Αυτό έρχεται μετά τη διαγραφή.
- Τέλος του σώματος του βρόχου for.
- Το πρόγραμμα πρέπει να επιστρέψει μια τιμή μετά την επιτυχή ολοκλήρωση.
- Τέλος του σώματος της συνάρτησης main().






