std::list in C++ με Παράδειγμα

Τι είναι το std::list;

In C++, το std::list αναφέρεται σε ένα δοχείο αποθήκευσης. Η std:list σάς επιτρέπει να εισάγετε και να αφαιρέσετε στοιχεία από οπουδήποτε. Η std::list υλοποιείται ως λίστα διπλά συνδεδεμένη. Αυτό σημαίνει ότι τα δεδομένα της λίστας μπορούν να προσπελαστούν αμφίδρομα και διαδοχικά.

Η λίστα Standard Template Library δεν υποστηρίζει γρήγορη τυχαία πρόσβαση, αλλά υποστηρίζει διαδοχική πρόσβαση από όλες τις κατευθύνσεις.

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

Γιατί να χρησιμοποιήσετε το std::list;

Εδώ, είναι ο λόγος χρήσης του std::List:

  • Η λίστα std:: συγκρίνεται καλύτερα με άλλα δοχεία ακολουθίας όπως πίνακας και διάνυσμα.
  • Έχουν καλύτερη απόδοση στην εισαγωγή, μετακίνηση και εξαγωγή στοιχείων από οποιαδήποτε θέση.
  • Το std::list τα πάει καλύτερα με αλγόριθμους που εκτελούν εντατικά τέτοιες λειτουργίες.

Σύνταξη λίστας

Για να ορίσουμε τη λίστα std:: πρέπει να εισάγουμε το αρχείο κεφαλίδας. Εδώ είναι η σύνταξη ορισμού std::list:

template < class Type, class Alloc =allocator<T> > class list;

Ακολουθεί μια περιγραφή των παραπάνω παραμέτρων:

  • T – Καθορίζει τον τύπο του στοιχείου που περιέχεται. Μπορείτε να αντικαταστήσετε το T με οποιονδήποτε τύπο δεδομένων, ακόμη και τύπους που ορίζονται από το χρήστη.
  • Alloc – Καθορίζει τον τύπο του αντικειμένου κατανεμητή. Χρησιμοποιεί το πρότυπο κλάσης εκχωρητή από προεπιλογή. Εξαρτάται από την τιμή και χρησιμοποιεί ένα απλό μοντέλο εκχώρησης μνήμης.

Παραδείγματα 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';
	}
}

Παραγωγή:

std::list

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

std::list

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

  1. Συμπεριλάβετε το αρχείο κεφαλίδας αλγορίθμου για να χρησιμοποιήσετε τις συναρτήσεις του.
  2. Συμπεριλάβετε το αρχείο κεφαλίδας iostream για να χρησιμοποιήσετε τις λειτουργίες του.
  3. Συμπεριλάβετε το αρχείο κεφαλίδας λίστας για να χρησιμοποιήσετε τις λειτουργίες του.
  4. Καλέστε τη συνάρτηση main(). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα αυτής της συνάρτησης.
  5. Δημιουργήστε μια λίστα με το όνομα my_list με ένα σύνολο 4 ακεραίων.
  6. Χρησιμοποιήστε έναν βρόχο for για να δημιουργήσετε μια μεταβλητή βρόχου x. Αυτή η μεταβλητή θα χρησιμοποιηθεί για επανάληψη πάνω από τα στοιχεία της λίστας.
  7. Εκτυπώστε τις τιμές της λίστας στην κονσόλα.
  8. Τέλος του σώματος του για βρόχο.
  9. Τέλος του σώματος της συνάρτησης 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;
}

Παραγωγή:

λίστα Κατασκευαστών

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

λίστα Κατασκευαστών

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

  1. Συμπεριλάβετε το αρχείο κεφαλίδας iostream για να χρησιμοποιήσετε τις λειτουργίες του.
  2. Συμπεριλάβετε το αρχείο κεφαλίδας λίστας για να χρησιμοποιήσετε τις λειτουργίες του.
  3. Συμπεριλάβετε τον χώρο ονομάτων std στον κώδικα για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
  4. Καλέστε τη συνάρτηση main(). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα αυτής της συνάρτησης.
  5. Δημιουργήστε μια κενή λίστα με το όνομα l.
  6. Δημιουργήστε μια λίστα με το όνομα l1 με ένα σύνολο 3 ακεραίων.
  7. Δημιουργήστε μια λίστα με το όνομα l2 με όλα τα στοιχεία της λίστας με το όνομα l1, από την αρχή μέχρι το τέλος.
  8. Δημιουργήστε μια λίστα με το όνομα l3 χρησιμοποιώντας τη σημασιολογία κίνησης. Η λίστα l3 θα έχει τα ίδια περιεχόμενα με τη λίστα l2.
  9. Εκτυπώστε το μέγεθος της λίστας με το όνομα l στην κονσόλα μαζί με άλλο κείμενο.
  10. Εκτυπώστε λίγο κείμενο στην κονσόλα.
  11. Δημιουργήστε έναν επαναλήπτη με το όνομά του και χρησιμοποιήστε τον για να επαναλάβετε τα στοιχεία της λίστας με το όνομα l2.
  12. Εκτυπώστε τα στοιχεία της λίστας με το όνομα l2 στην κονσόλα.
  13. Εκτυπώστε λίγο κείμενο στην κονσόλα.
  14. Δημιουργήστε έναν επαναλήπτη με το όνομά του και χρησιμοποιήστε τον για να επαναλάβετε τα στοιχεία της λίστας με το όνομα l3.
  15. Εκτυπώστε τα στοιχεία της λίστας με το όνομα l3 στην κονσόλα.
  16. Το πρόγραμμα πρέπει να επιστρέψει τιμή μετά την επιτυχή ολοκλήρωση.
  17. Τέλος του σώματος της συνάρτησης 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';
	}
}

Παραγωγή:

Εισαγωγή σε λίστα

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

Εισαγωγή σε λίστα

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

  1. Συμπεριλάβετε το αρχείο κεφαλίδας αλγορίθμου για να χρησιμοποιήσετε τις συναρτήσεις του.
  2. Συμπεριλάβετε το αρχείο κεφαλίδας iostream για να χρησιμοποιήσετε τις λειτουργίες του.
  3. Συμπεριλάβετε το αρχείο κεφαλίδας λίστας για να χρησιμοποιήσετε τις λειτουργίες του.
  4. Καλέστε τη συνάρτηση main(). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα αυτής της συνάρτησης.
  5. Δημιουργήστε μια λίστα με το όνομα my_list με ένα σύνολο 4 ακεραίων.
  6. Εισαγάγετε το στοιχείο 11 στο μπροστινό μέρος της λίστας με το όνομα my_list.
  7. Εισαγάγετε το στοιχείο 18 στο τέλος της λίστας με το όνομα my_list.
  8. Δημιουργήστε έναν επαναλήπτη και χρησιμοποιήστε τον για να βρείτε το στοιχείο 10 από τη λίστα my_list.
  9. Χρησιμοποιήστε μια δήλωση if για να προσδιορίσετε εάν το παραπάνω στοιχείο βρέθηκε ή όχι.
  10. Εισαγάγετε το στοιχείο 21 πριν από το παραπάνω στοιχείο εάν βρέθηκε.
  11. Τέλος του σώματος της δήλωσης if.
  12. Χρησιμοποιήστε έναν βρόχο for για να δημιουργήσετε μια μεταβλητή βρόχου x. Αυτή η μεταβλητή θα χρησιμοποιηθεί για επανάληψη πάνω από τα στοιχεία της λίστας.
  13. Εκτυπώστε τις τιμές της λίστας στην κονσόλα.
  14. Τέλος του σώματος του βρόχου for.
  15. Τέλος του σώματος της συνάρτησης 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;
}

Παραγωγή:

Διαγραφή από λίστα

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

Διαγραφή από λίστα

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

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

Περίληψη

  • Το std::list είναι ένα δοχείο αποθήκευσης.
  • Επιτρέπει την εισαγωγή και διαγραφή στοιχείων από οπουδήποτε σε σταθερό χρόνο.
  • Υλοποιείται ως διπλός σύνδεσμος
  • Τα δεδομένα std::list μπορούν να προσπελαστούν αμφίδρομα και διαδοχικά.
  • Το std::list δεν υποστηρίζει γρήγορη τυχαία πρόσβαση. Ωστόσο, υποστηρίζει διαδοχική πρόσβαση από όλες τις κατευθύνσεις.
  • Μπορείτε να διασκορπίσετε στοιχεία λίστας του std::list σε διαφορετικά κομμάτια μνήμης.
  • Μπορείτε να συρρικνώσετε ή να επεκτείνετε το std::list και από τα δύο άκρα όπως απαιτείται κατά τη διάρκεια του χρόνου εκτέλεσης.
  • Για να εισάγουμε στοιχεία στο std::list, χρησιμοποιούμε τη συνάρτηση insert().
  • Για να διαγράψουμε στοιχεία από τη λίστα std:: χρησιμοποιούμε τη συνάρτηση erase().