τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Το κάτω επίπεδο της λίστας είναι μια αμφίδρομη κυκλική συνδεδεμένη δομή λίστας με bits φρουρού.
Σε σύγκριση με τη δομή λιστών μεμονωμένης σύνδεσης του forward_list, ο επαναλήπτης της λίστας είναι ένας επαναλήπτης αμφίδρομης κατεύθυνσης
Σε σύγκριση με διαδοχικά δομημένα δοχεία, όπως το διανυσματικό, η λίστα είναι πιο αποτελεσματική στην εισαγωγή και διαγραφή σε οποιαδήποτε θέση, αλλά δεν υποστηρίζει τυχαία πρόσβαση σε οποιαδήποτε θέση.
Η λίστα είναι μια κλάση προτύπου Όταν τη χρησιμοποιούμε, πρέπει να δώσουμε τον τύπο του στοιχείου.Όταν χρησιμοποιείτε την κλάση λίστας, πρέπει να συμπεριλάβετε το αρχείο κεφαλίδας<list>
list();
Για παράδειγμα:
- void test()
- {
- list<int> lt;
- }
list(size_type n, const value_type& val = value_type());
Για παράδειγμα:
- void test()
- {
- list<int> lt(3, 1);
- for (auto i : lt)
- {
- cout << i << " ";
- }
- }
αποτέλεσμα λειτουργίας:
list(const list& x);
Για παράδειγμα:
- void test()
- {
- list<int> lt(3, 1);
- list<int> lt1(lt);
- for (auto i : lt1)
- {
- cout << i << " ";
- }
- }
αποτέλεσμα λειτουργίας:
- Template<class InputIterator>
-
- list(InputIterator first, InputIterator last);
Για παράδειγμα:
- void test()
- {
- list<int> lt(3, 1);
- list<int> lt1(lt.begin(), lt.end());
- for (auto i : lt1)
- {
- cout << i << " ";
- }
- }
αποτέλεσμα λειτουργίας:
Είναι ακόμα το ίδιο, επιτρέψτε μου να το συζητήσουμε μαζί εδώ.
Μέγεθος:ΕΠΙΣΤΡΟΦΗσυνδεδεμένη λίσταΟ αριθμός των στοιχείων στο δοχείο.
size_type size() const;
αδειάζω:ΕΠΙΣΤΡΟΦΗλίσταΕάν το δοχείο είναι άδειο (δηλΜέγεθοςείναι 0).
(Σημείωση: Αυτή η λειτουργία δεν τροποποιεί το κοντέινερ με κανέναν τρόπο. Για εκκαθάρισησυνδεδεμένη λίσταΤα περιεχόμενα του δοχείου, βλλίστα:: σαφής。)
bool empty() const;
μέγιστο_μέγεθος(δεν χρησιμοποιείται συνήθως): επιστροφήσυνδεδεμένη λίσταΟ μέγιστος αριθμός στοιχείων που μπορεί να χωρέσει το δοχείο.
(Λόγω γνωστών περιορισμών υλοποίησης συστήματος ή βιβλιοθήκης, αυτό είναι το μέγιστο δυναμικό που μπορεί να επιτύχει ένα κοντέινερΜέγεθος , αλλά δεν υπάρχει καμία εγγύηση ότι το κοντέινερ θα φτάσει σε αυτό το μέγεθος: ενδέχεται να μην μπορεί να εκχωρήσει χώρο αποθήκευσης ανά πάσα στιγμή πριν φτάσει σε αυτό το μέγεθος. )
size_type max_size() const;
αλλαγή μεγέθους:Αλλάξτε το μέγεθος του δοχείου ώστε να περιέχειnστοιχεία.
ανnμικρότερο από το τρέχον δοχείοΜέγεθος, το περιεχόμενο θα μειωθεί στο προηγούμενοnστοιχεία, αφαιρώντας αυτά που υπερβαίνουν (και καταστρέφοντάς τα).
ανnΜεγαλύτερο από το τρέχον δοχείοΜέγεθος, τότε το περιεχόμενο επεκτείνεται εισάγοντας τον απαιτούμενο αριθμό στοιχείων στο τέλος για να επιτευχθείn το μέγεθος του.Εάν ορίζεταιval, τότε το νέο στοιχείο θα αρχικοποιηθεί σεvalαντίγραφα, διαφορετικά αρχικοποιούνται ως προς την αξία.
(Σημειώστε ότι αυτή η λειτουργία αλλάζει τα πραγματικά περιεχόμενα του δοχείου εισάγοντας ή σβήνοντας στοιχεία από το δοχείο.)
void resize (size_type n, value_type val = value_type());
Για παράδειγμα:
-
- void test()
- {
- list<int> lt(3, 1);
- /*list<int> lt1(lt);*/
- list<int> lt1(lt.begin(), lt.end());
- list<int> lt2;
- cout << lt1.size() <<endl;
- cout << lt1.empty() <<endl;
- cout << lt2.empty() <<endl;
- lt1.resize(10);
- cout << lt1.size() << endl;
- for (auto i : lt1)
- {
- cout << i << " ";
- }
- }
-
-
αποτέλεσμα λειτουργίας:
- iterator begin();
-
- const_iterator begin() const;
-
- iterator end();
-
- const_iterator end() const;
Iterator: χρησιμοποιείται για τη λήψη της θέσης του πρώτου κόμβου και του τελευταίου κόμβου στη συνδεδεμένη λίσταΕπόμενη θέση (δηλαδή θέση φρουρού)
Για παράδειγμα:
- void test()
- {
- list<int> lt(5, 2);
- list<int> ::iterator it = lt.begin();
- while (it != lt.end())
- {
- cout << *it << " ";
- ++it;
- }
- }
αποτέλεσμα λειτουργίας:
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
reverse_iterator rend();
const_reverse_iterator rend() const;
Αντίστροφος επαναλήπτης, το rbegin παίρνει τη θέση του τελευταίου κόμβου στο κοντέινερ, το rend παίρνει τη θέση του bit φρουρού στο κοντέινερ
- void test()
- {
- list<int> lt = { 1,23,4,4,5,2 };
- list<int> ::reverse_iterator rit = lt.rbegin();
- while (rit != lt.rend())
- {
- cout << *rit << " ";
- ++rit;
- }
- }
αποτέλεσμα λειτουργίας:
Σημείωση: Το reverse iterator rit θα πρέπει επίσης να χρησιμοποιεί ++ αντί για --
εμπρός:
front reference();
const_reference front() const;
Επιστρέφει μια αναφορά στα δεδομένα που είναι αποθηκευμένα στον πρώτο κόμβο στη συνδεδεμένη λίστα
πίσω:
αναφορά πίσω();
const_reference back() const;
Επιστρέφει μια αναφορά στα δεδομένα που είναι αποθηκευμένα στον τελευταίο κόμβο της συνδεδεμένης λίστας
Για παράδειγμα:
- void test()
- {
- list<int> lt = {213123,123,34524,213};
- cout << lt.front() << endl;
- cout << lt.back() << endl;
-
- }
αποτέλεσμα λειτουργίας:
Το push_front ονομάζεται εισαγωγή κεφαλής, εισάγοντας ένα στοιχείο από την κεφαλή της συνδεδεμένης λίστας
void push_front(const value_type& val);
Το pop_front ονομάζεται διαγραφή κεφαλής, το οποίο διαγράφει ένα στοιχείο από την κεφαλή της συνδεδεμένης λίστας.
void pop_front();
void pop_front();
Για παράδειγμα:
- void test()
- {
- list<int> lt = {213123,123,34524,213};
- cout << lt.front() << endl;
- lt.push_front(21345);
- cout << lt.front() << endl;
- lt.pop_front();
- cout << lt.front() << endl;
- }
αποτέλεσμα λειτουργίας:
Το push_back ονομάζεται εισαγωγή ουράς, εισάγοντας ένα στοιχείο από το τέλος της συνδεδεμένης λίστας
void push_back(const value_type& val);
Το pop_back ονομάζεται διαγραφή ουράς, το οποίο διαγράφει ένα στοιχείο από το τέλος της συνδεδεμένης λίστας.
void pop_back();
Για παράδειγμα:
- void test()
- {
- list<int> lt = {213123,123,34524,213};
- cout << lt.back() << endl;
- lt.push_back(21345);
- cout << lt.back() << endl;
- lt.pop_back();
- cout << lt.back() << endl;
- }
αποτέλεσμα λειτουργίας:
- template <class InputIterator, class T>
-
- InputIterator find(InputIterator first, InputIterator last, const T& val);
Βρείτε το val στο εύρος δύο επαναλήψεων και επιστρέψτε τον επαναλήπτη στο σημείο που βρίσκεται
Για παράδειγμα:
- void test()
- {
- list<int> lt;
- for (int i = 0; i < 3; i++)
- {
- lt.push_back(i);
- }
- list<int>::iterator pos = find(lt.begin(), lt.end(), 1);
- *pos = 114514;
- for (auto i : lt)
- {
- cout << i << " ";
- }
- }
αποτέλεσμα λειτουργίας:
Σημείωση: Αυτή η συνάρτηση δεν είναι συνάρτηση μέλους της λίστας, αλλά συνάρτηση στην τυπική βιβλιοθήκη Πολλαπλά κοντέινερ μοιράζονται τη συνάρτηση εύρεσης.
Όπως μπορείτε να δείτε, μπορούμε να αποαναφέρουμε απευθείας τον επαναλήπτη της λίστας και να τροποποιήσουμε το περιεχόμενό της, αλλά δεν πρέπει ο επαναλήπτης να δείχνει προς τον κόμβο; Γιατί η αποαναφορά του μπορεί να τροποποιήσει τα δεδομένα;
Στην πραγματικότητα, ο επαναλήπτης της λίστας δεν προσομοιώνεται και υλοποιείται χρησιμοποιώντας τον αρχικό οικολογικό δείκτη και πρέπει να ενσωματωθεί στο κάτω μέρος, κάτι που θα αντικατοπτρίζεται στον πηγαίο κώδικα της προσομοιωμένης υλοποίησης της λίστας.
Εισαγωγή επαναλήπτη (θέση επαναλήπτη, τιμή_συνθήκης& val);
void insert(θέση επαναλήπτη, size_type n, const value_type& val);
————————————————————————————————————————
πρότυπο<class InputIterator>
void insert(θέση επαναλήπτη, πρώτος InputIterator, τελευταίος InputIterator).
Εισαγάγετε ένα ή περισσότερα στοιχεία μπροστά από τη θέση
Για παράδειγμα:
- void test()
- {
- list<int> lt;
- for (int i = 0; i < 3; i++)
- {
- lt.push_back(i);
- }
- list<int>::iterator pos = find(lt.begin(), lt.end(), 1);
- lt.insert(pos, 8848);
- for (auto i : lt)
- {
- cout << i << " ";
- }
- }
αποτέλεσμα λειτουργίας:
Οι προσεκτικοί μαθητές μπορεί να έχουν ανακαλύψει ότι η λειτουργία εισαγωγής της λίστας είναιΔεν θα προκαλέσει την ακύρωση του επαναληπτικού, επειδή ο κόμβος που επισημαίνεται με pos παραμένει αμετάβλητος και η σχετική θέση δεν αλλάζει.
Ωστόσο, η λειτουργία διαγραφής της λίστας θα προκαλέσει σίγουρα την ακύρωση του επαναλήπτη και μόνο ο επαναλήπτης που δείχνει τον διαγραμμένο κόμβο θα γίνει άκυρος και άλλοι επαναλήπτες δεν θα επηρεαστούν.
- iterator erase(iterator position);
-
- iterator erase(iterator first, iterator last);
Διαγράψτε το στοιχείο στη θέση ή όλα τα στοιχεία στο εύρος [πρώτο, τελευταίο)
Για παράδειγμα:
- void test()
- {
- list<int> lt;
- for (int i = 0; i < 3; i++)
- {
- lt.push_back(i);
- }
- list<int>::iterator pos = find(lt.begin(), lt.end(), 1);
- lt.erase(lt.begin());
- for (auto i : lt)
- {
- cout << i << " ";
- }
- }
αποτέλεσμα λειτουργίας:
- void test()
- {
- list<int> lt;
- for (int i = 0; i < 3; i++)
- {
- lt.push_back(i);
- }
- list<int>::iterator pos = find(lt.begin(), lt.end(), 2);
- lt.erase(lt.begin(),pos);
- for (auto i : lt)
- {
- cout << i << " ";
- }
- }
αποτέλεσμα λειτουργίας:
void swap(διάνυσμα& x);
Ανταλλάξτε δύο αντικείμενα λίστας
Για παράδειγμα:
- void test()
- {
- list<int> lt;
- list<int> lt2(6, 12);
- for (int i = 0; i < 10; i++)
- {
- lt.push_back(i);
- }
- lt.swap(lt2);
- for (auto i : lt2)
- {
- cout << i << " ";
- }
- cout << endl;
- }
αποτέλεσμα λειτουργίας:
πρότυπο<class InputIterator>
void assign (InputIterator πρώτα, InputIterator τελευταίο);
void assign(size_type n, const value_type& val);
Καθορίστε νέο περιεχόμενο για τη λίστα, αντικαταστήστε το τρέχον περιεχόμενό της και τροποποιήστε τον αριθμό των κόμβων
Για παράδειγμα:
- void test()
- {
- list<int> lt;
- for (int i = 0; i < 10; i++)
- {
- lt.push_back(i);
- }
- lt.assign(4, 0);
- for (auto i : lt)
- {
- cout << i << " ";
- }
- }
αποτέλεσμα λειτουργίας:
void clear();
Διαγράψτε όλους τους κόμβους στη συνδεδεμένη λίστα
Για παράδειγμα:
- void test()
- {
- list<int> lt;
- for (int i = 0; i < 10; i++)
- {
- lt.push_back(i);
- }
- lt.clear();
- cout << lt.size() << endl;
- }
αποτέλεσμα λειτουργίας:
void sort();
πρότυπο<class Compare>
void sort(Σύγκριση comp);
Λόγω της ιδιαιτερότητας της δομής της λίστας, η συνάρτηση ταξινόμησης στην τυπική βιβλιοθήκη δεν μπορεί να χρησιμοποιηθεί, επειδή ο επαναλήπτης δεν μπορεί να εκτελέσει λειτουργίες αφαίρεσης.
Και στην τεκμηρίωση της C++, μπορούμε να δούμε ότι η ταξινόμηση στην τυπική βιβλιοθήκη περιορίζει επίσης τον τύπο του επαναλήπτη ως τυχαία πρόσβαση (RandomAccess)
- default (1)
- template <class RandomAccessIterator>
- void sort (RandomAccessIterator first, RandomAccessIterator last);
- custom (2)
- template <class RandomAccessIterator, class Compare>
- void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
Οι επαναλήπτες έχουν διάφορες λειτουργικές κατηγορίες:
- Μονόδρομος επαναλήπτης, μπορεί να κάνει μόνο ++
- Δικατευθυντικός επαναλήπτης, μπορεί να είναι ++ και --
- Τυχαίος επαναλήπτης, μπορεί να είναι ++, --, + και -
Ωστόσο, η λειτουργία ταξινόμησης της λίστας δεν είναι απαραίτητη, επειδή η αποτελεσματικότητα της απευθείας ταξινόμησης της συνδεδεμένης λίστας είναι πολύ πιο αργή από την αντιγραφή στο διάνυσμα, την ταξινόμηση και, στη συνέχεια, την αντιγραφή στη συνδεδεμένη λίστα.
template <class BidirectionalIterator> void reverse (BidirectionalIterator first, BidirectionalIterator last);
Αντιστρέψτε τη συνδεδεμένη λίστα
Για παράδειγμα:
- void test()
- {
- list<int> lt;
- for (int i = 0; i < 10; i++)
- {
- lt.push_back(i);
- }
- for (auto i : lt)
- {
- cout << i << " ";
- }
- cout << endl;
- lt.reverse();
- for (auto i : lt)
- {
- cout << i << " ";
- }
- cout << endl;
-
- }
αποτέλεσμα λειτουργίας:
Εάν υπάρχουν σφάλματα, παρακαλώ διορθώστε με.