Χάρτης μέσα C++ Τυπική βιβλιοθήκη προτύπων (STL)
⚡ Έξυπνη Σύνοψη
Χάρτης μέσα C++ είναι ένα συσχετιστικό κοντέινερ από τη Βιβλιοθήκη Τυπικών Προτύπων που αποθηκεύει στοιχεία ως ταξινομημένα ζεύγη κλειδιού-τιμής, όπου κάθε μοναδικό κλειδί αντιστοιχεί σε μία τιμή και επιτρέπει γρήγορη αναζήτηση, εισαγωγή και ταξινομημένη διέλευση.

Σε τι είναι ο Χάρτης C++?
In C++, ένα MAP είναι ένα συσχετιστικό κοντέινερ που αποθηκεύει στοιχεία σε αντιστοιχισμένη μορφή. Κάθε στοιχείο στο χάρτη αποτελείται από μια τιμή-κλειδί και μια αντιστοιχισμένη τιμή. Δύο αντιστοιχισμένες τιμές δεν μπορούν να μοιράζονται τις ίδιες τιμές-κλειδιά.
Οι τιμές-κλειδιά είναι χρήσιμες για την ταξινόμηση και τον μοναδικό προσδιορισμό στοιχείων, ενώ οι αντιστοιχισμένες τιμές αποθηκεύουν το περιεχόμενο που σχετίζεται με κάθε κλειδί. Τα δύο μπορεί να διαφέρουν ως προς τον τύπο, αλλά ο τύπος μέλους τα συνδυάζει σε ένα ζεύγος που περιέχει και τα δύο.
Πριν γράψετε οποιονδήποτε κώδικα, είναι χρήσιμο να γνωρίζετε γιατί ένας χάρτης είναι συχνά το κατάλληλο δοχείο για να το χρησιμοποιήσετε.
Γιατί να χρησιμοποιήσετε το std::map;
Ακολουθούν οι λόγοι για τη χρήση ενός χάρτη:
- Η std::map αποθηκεύει μόνο μοναδικά κλειδιά, με ταξινομημένη σειρά βάσει των επιλεγμένων κριτηρίων ταξινόμησης.
- Είναι εύκολο και γρήγορο να αναζητήσετε στοιχεία χρησιμοποιώντας το πλήκτρο.
- Μόνο ένα στοιχείο είναι προσαρτημένο σε κάθε κλειδί.
- Το std::map μπορεί να χρησιμοποιηθεί ως συσχετικός πίνακας.
- Το std::map είναι υλοποιήσιμο χρησιμοποιώντας ισορροπημένα δυαδικά δέντρα.
Για να αξιοποιήσετε αυτά τα οφέλη, ξεκινήστε με τη σύνταξη δήλωσης.
Σύνταξη
Για να δηλώσετε std::map, χρησιμοποιήστε αυτήν τη σύνταξη:
std::map<key_datatype, value_datatype>map_name;
- The τύπος_κλειδιού_δεδομένων υποδηλώνει τον τύπο δεδομένων των πλήκτρων χάρτη.
- The τύπος_δεδομένων_τιμής υποδηλώνει τον τύπο δεδομένων των τιμών που αντιστοιχούν στα πλήκτρα χάρτη.
- The όνομα_μαπ είναι το όνομα του χάρτη.
Για παράδειγμα:
map<string, int> my_map;
Δηλώσαμε έναν χάρτη με το όνομα my_map. Ο χάρτης θα έχει μια συμβολοσειρά ως τύπο δεδομένων κλειδιού και έναν ακέραιο αριθμό ως τύπο δεδομένων τιμών.
Τύποι μελών
Οι συναρτήσεις-μέλη μπορούν να χρησιμοποιήσουν τους ακόλουθους τύπους μελών είτε ως παραμέτρους είτε ως τύπο επιστροφής:
- key_type: Κλειδί (η πρώτη παράμετρος στο πρότυπο)
- mappped_type: T (η δεύτερη παράμετρος στο πρότυπο)
- key_compare: Σύγκριση (η τρίτη παράμετρος στο πρότυπο)
- allocator_type: Alloc (η τέταρτη παράμετρος στο πρότυπο)
- value_type: ζεύγος
- value_compare: Ένθετη κλάση συνάρτησης για σύγκριση στοιχείων
- αναφορά: allocator_type::reference
- const_reference: allocator_type::const_reference
- δείκτης: allocator_type::pointer
- const_pointer: allocator_type::const_pointer
- επαναλήπτης: έναν αμφίδρομο επαναλήπτη για τον τύπο_τιμής
- const_iterator: έναν αμφίδρομο επαναλήπτη στον τύπο_const value
- reverse_iterator: ένας αντίστροφος επαναλήπτης
- const_reverse_iterator: ένας σταθερός αντίστροφος επαναλήπτης
- διαφορά_τύπος: ptrdiff_t
- Τύπος Μεγέθους: μέγεθος_t
Ενσωματωμένες Λειτουργίες του std::map
Το std::map συνοδεύεται από ενσωματωμένες λειτουργίες. Μερικά από αυτά περιλαμβάνουν:
- να αρχίσει() – Αυτή η συνάρτηση επιστρέφει τον επαναλήπτη στο πρώτο στοιχείο του χάρτη.
- Μέγεθος() – Αυτή η συνάρτηση επιστρέφει τον αριθμό των στοιχείων σε έναν χάρτη.
- αδειάζω() – Αυτή η συνάρτηση επιστρέφει μια λογική τιμή που δηλώνει εάν ένας χάρτης είναι κενός.
- εισαγωγή(ζεύγος(κλειδί, τιμή)) – Αυτή η συνάρτηση εισάγει ένα νέο ζεύγος κλειδιού-τιμής σε έναν χάρτη.
- εύρεση(τιμή) – Αυτή η συνάρτηση δίνει τον επαναλήπτη στο στοιχείο val εάν βρεθεί. Διαφορετικά, επιστρέφει m.end().
- διαγραφή (θέση επαναλήπτη) – Αυτή η συνάρτηση διαγράφει το στοιχείο στη θέση που υποδεικνύει ο επαναλήπτης.
- διαγραφή (const g) – Αυτή η συνάρτηση διαγράφει το κλειδί-τιμή g από έναν χάρτη.
- Σαφή() – Αυτή η λειτουργία διαγράφει όλα τα στοιχεία από έναν χάρτη.
Με τις συναρτήσεις ορισμένες, τα ακόλουθα παραδείγματα τις θέτουν σε εφαρμογή, ξεκινώντας με επανάληψη.
Επανάληψη στα Στοιχεία χάρτη
Μπορείτε να επαναλάβετε τα στοιχεία του χάρτη. Απλώς πρέπει να δημιουργήσουμε έναν επαναλήπτη και να τον χρησιμοποιήσουμε για αυτό. Για παράδειγμα:
Παράδειγμα 1
#include <iostream> #include <string> #include <map> using namespace std; int main() { map<int, string> Students; Students.insert(std::pair<int, string>(200, "Alice")); Students.insert(std::pair<int, string>(201, "John")); cout << "Map size is: " << Students.size() << endl; cout << endl << "Default map Order is: " << endl; for (map<int, string>::iterator it = Students.begin(); it != Students.end(); ++it) { cout << (*it).first << ": " << (*it).second << endl; } }
Παραγωγή:
Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:
Code Επεξήγηση:
- Συμπεριλάβετε το αρχείο κεφαλίδας iostream στον κώδικά μας για να χρησιμοποιήσετε τις λειτουργίες του.
- Συμπεριλάβετε το αρχείο κεφαλίδας συμβολοσειράς στον κώδικά μας για να χρησιμοποιήσετε τις συναρτήσεις του.
- Συμπεριλάβετε το αρχείο κεφαλίδας χάρτη στον κώδικά μας για να χρησιμοποιήσετε τις λειτουργίες του.
- Συμπεριλάβετε τον χώρο ονομάτων std στον κώδικά μας για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
- Καλέστε τη συνάρτηση main(). Το { σηματοδοτεί την αρχή του σώματος της συνάρτησης.
- Δημιουργήστε έναν χάρτη με το όνομα Students όπου τα κλειδιά θα είναι ακέραιοι και οι τιμές θα είναι συμβολοσειρές.
- Εισαγάγετε τιμές στον χάρτη Μαθητές. Ένα κλειδί 200 και μια τιμή Alice θα εισαχθούν στον χάρτη.
- Εισαγάγετε τιμές στον χάρτη Μαθητές. Ένα κλειδί 201 και μια τιμή John θα εισαχθεί στον χάρτη.
- Χρησιμοποιήστε τη συνάρτηση size() για να λάβετε το μέγεθος του χάρτη με το όνομα Students. Αυτή θα πρέπει να επιστρέψει την τιμή 2.
- Εκτυπώστε λίγο κείμενο στην κονσόλα.
- Χρησιμοποιήστε έναν βρόχο for για να δημιουργήσετε έναν επαναλήπτη με το όνομά του για επανάληψη πάνω από τα στοιχεία του χάρτη με το όνομα Students.
- Εκτυπώστε τις τιμές του χάρτη Students στην κονσόλα.
- Τέλος του σώματος του βρόχου for.
- Τέλος του σώματος της συνάρτησης main().
Εισαγωγή δεδομένων στο std::map
Μπορείτε να εισαγάγετε στοιχεία στο std::map χρησιμοποιώντας τη συνάρτηση insert(). Να θυμάστε ότι τα κλειδιά std::map πρέπει να είναι μοναδικά.
Έτσι, πρώτα ελέγχει εάν κάθε κλειδί υπάρχει στον χάρτη. Εάν υπάρχει, η καταχώρηση δεν θα εισαχθεί, αλλά επιστρέφει τον επαναλήπτη για την υπάρχουσα καταχώρηση. Εάν δεν υπάρχει, η καταχώρηση εισάγεται.
Η συνάρτηση έχει τις ακόλουθες παραλλαγές:
- εισαγωγή (ζεύγος) – με αυτήν την παραλλαγή, ένα ζεύγος κλειδιού-τιμής εισάγεται στον χάρτη.
- εισαγωγή(έναρξη_itr, τέλος_itr) – με αυτήν την παραλλαγή, οι καταχωρήσεις θα εισαχθούν εντός του εύρους που ορίζεται από τις συναρτήσεις start_itr και end_itr από έναν άλλο χάρτη.
Η συνάρτηση insert_or_assign() λειτουργεί με τον ίδιο τρόπο όπως η συνάρτηση insert(), αλλά αν το δεδομένο κλειδί υπάρχει ήδη στον χάρτη, η τιμή του θα τροποποιηθεί.
Παράδειγμα 2
#include <map> #include <iostream> using namespace std; int main() { map<int, int> m{ {1,3} , {2,4} , {3,5} }; m.insert({ 5, 6 }); m.insert({ 1, 8 }); m.insert_or_assign(1, 6); cout << "Key\tElement\n"; for (auto itr = m.begin(); itr != m.end(); ++itr) { cout << itr->first << '\t' << itr->second << '\n'; } return 0; }
Παραγωγή:
Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:
Code Επεξήγηση:
- Συμπεριλάβετε το αρχείο κεφαλίδας χάρτη στον κώδικά μας για να χρησιμοποιήσετε τις λειτουργίες του.
- Συμπεριλάβετε το αρχείο κεφαλίδας iostream στον κώδικά μας για να χρησιμοποιήσετε τις λειτουργίες του.
- Συμπεριλάβετε τον χώρο ονομάτων std στον κώδικά μας για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
- Καλέστε τη συνάρτηση main(). Το { σηματοδοτεί την αρχή του σώματος της συνάρτησης.
- Δημιουργήστε έναν χάρτη με το όνομα m όπου τα κλειδιά θα είναι ακέραιοι και οι τιμές θα είναι ακέραιοι. Στον χάρτη έχουν γίνει τρεις εγγραφές.
- Εισαγάγετε μια νέα καταχώρηση στον χάρτη m. Ένα κλειδί 5 και μια τιμή 6 θα εισαχθούν στον χάρτη.
- Προσπάθεια εισαγωγής σε ένα ήδη υπάρχον κλειδί. Εφόσον το κλειδί 1 υπάρχει ήδη στον χάρτη, η καταχώρηση δεν θα γίνει.
- Χρήση της συνάρτησης insert_or_assign() για την εισαγωγή ή τροποποίηση μιας υπάρχουσας καταχώρησης. Εφόσον το κλειδί 1 υπάρχει ήδη, η τιμή του θα αλλάξει σε 6.
- Εκτυπώστε λίγο κείμενο στην κονσόλα. Ο χαρακτήρας "\t" δημιουργεί ένα οριζόντιο διάστημα ενώ ο χαρακτήρας "\n" μετακινεί τον κέρσορα του ποντικιού στην επόμενη γραμμή.
- Χρήση για βρόχο για να δημιουργήσετε έναν επαναλήπτη με το όνομα itr για να επαναλάβετε τα στοιχεία του χάρτη με το όνομα m.
- Εκτυπώστε τις τιμές του χάρτη m στην κονσόλα. Ο χαρακτήρας "\t" δημιουργεί ένα οριζόντιο κενό μεταξύ κάθε κλειδιού και της αντίστοιχης τιμής του. Αντίθετα, ο χαρακτήρας "\n" μετακινεί τον κέρσορα του ποντικιού στην επόμενη γραμμή μετά από κάθε επανάληψη.
- Τέλος του σώματος του βρόχου for.
- Το πρόγραμμα πρέπει να επιστρέψει μια τιμή μετά την επιτυχή ολοκλήρωση.
- Τέλος του σώματος της συνάρτησης main().
Αναζήτηση σε χάρτη
Μπορούμε να χρησιμοποιήσουμε τη συνάρτηση find() για να αναζητήσουμε στοιχεία σε έναν χάρτη με βάση τα κλειδιά τους. Εάν το κλειδί δεν βρεθεί, η συνάρτηση επιστρέφει std::map::end. Διαφορετικά, θα επιστραφεί ένας επαναλήπτης του αναζητούμενου στοιχείου.
Παράδειγμα 3
#include <iostream> #include <string> #include <map> using namespace std; int main() { map<int, string> Students; Students.insert(std::pair<int, string>(200, "Alice")); Students.insert(std::pair<int, string>(201, "John")); std::map<int, string>::iterator it = Students.find(201); if (it != Students.end()) { std::cout << endl << "Key 201 has the value: => "<< Students.find(201)->second << '\n'; } }
Παραγωγή:
Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:
Code Επεξήγηση:
- Συμπεριλάβετε το αρχείο κεφαλίδας iostream στον κώδικά μας για να χρησιμοποιήσετε τις λειτουργίες του χωρίς να λάβετε σφάλματα.
- Συμπεριλάβετε το αρχείο κεφαλίδας συμβολοσειράς στον κώδικά μας για να χρησιμοποιήσετε τις συναρτήσεις του χωρίς να λάβετε σφάλματα.
- Συμπεριλάβετε το αρχείο κεφαλίδας χάρτη στον κώδικά μας για να χρησιμοποιήσετε τις λειτουργίες του χωρίς να λάβετε σφάλματα.
- Συμπεριλάβετε τον χώρο ονομάτων std στον κώδικά μας για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
- Καλέστε τη συνάρτηση main(). Το { σηματοδοτεί την αρχή του σώματος της συνάρτησης main().
- Δημιουργήστε έναν χάρτη με το όνομα Students του οποίου τα κλειδιά θα είναι ακέραιοι και συμβολοσειρές τιμών.
- Εισαγάγετε τιμές στον χάρτη Μαθητές. Ένα κλειδί 200 και μια τιμή Alice θα εισαχθούν στον χάρτη.
- Εισαγάγετε τιμές στον χάρτη Μαθητές. Ένα κλειδί 201 και μια τιμή John θα εισαχθεί στον χάρτη.
- Αναζητήστε την τιμή που σχετίζεται με ένα κλειδί 201.
- Χρησιμοποιήστε μια δήλωση if για να ελέγξετε εάν βρέθηκε η τιμή για το κλειδί.
- Εκτυπώστε την τιμή του κλειδιού μαζί με κάποιο κείμενο στην κονσόλα.
- Τέλος του σώματος της δήλωσης if.
- Τέλος του σώματος της συνάρτησης main().
Διαγραφή δεδομένων από χάρτη
Μπορούμε να χρησιμοποιήσουμε τη συνάρτηση erase() για να διαγράψουμε μια τιμή από έναν χάρτη. Απλώς δημιουργούμε έναν επαναλήπτη που δείχνει στο στοιχείο που πρόκειται να διαγραφεί. Ο επαναλήπτης στη συνέχεια διαβιβάζεται στη συνάρτηση erase().
Παράδειγμα 4
#include <iostream> #include <string> #include <map> using namespace std; int main() { map<std::string, int> my_map; my_map.insert(std::make_pair("cow", 1)); my_map.insert(std::make_pair("cat", 2)); my_map["lion"] = 3; map<std::string, int>::iterator it = my_map.find("cat"); my_map.erase(it); for (map<string, int>::iterator it = my_map.begin(); it != my_map.end(); ++it) cout << (*it).first << ": " << (*it).second << endl; return 0; }
Παραγωγή:
Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:
Code Επεξήγηση:
- Συμπεριλάβετε το αρχείο κεφαλίδας iostream στον κώδικά μας για να χρησιμοποιήσετε τις λειτουργίες του.
- Συμπεριλάβετε το αρχείο κεφαλίδας συμβολοσειράς στον κώδικά μας για να χρησιμοποιήσετε τις συναρτήσεις του.
- Συμπεριλάβετε το αρχείο κεφαλίδας χάρτη στον κώδικά μας για να χρησιμοποιήσετε τις λειτουργίες του.
- Συμπεριλάβετε τον χώρο ονομάτων std στον κώδικά μας για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
- Καλέστε τη συνάρτηση main(). Το { σηματοδοτεί την αρχή του σώματος της συνάρτησης main().
- Δημιουργήστε έναν χάρτη με το όνομα my_map του οποίου τα κλειδιά θα είναι συμβολοσειρές και τιμές ακέραιοι.
- Εισαγάγετε τιμές στον χάρτη my_map. Ένα κλειδί του Cow και μια τιμή 1 θα εισαχθούν στον χάρτη.
- Εισαγάγετε τιμές στον χάρτη my_map. Ένα κλειδί Cat και μια τιμή 2 θα εισαχθούν στον χάρτη.
- Προσθέστε μια τιμή 3 στον χάρτη my_map με ένα κλειδί λιονταριού.
- Δημιουργήστε έναν επαναλήπτη για επανάληψη στον χάρτη my_map αναζητώντας τη βασική γάτα.
- Διαγράψτε το στοιχείο στο οποίο επισημαίνεται ο επαναλήπτης.
- Χρησιμοποιήστε έναν επαναλήπτη για να επαναλάβετε τα στοιχεία του χάρτη my_map από την αρχή μέχρι το τέλος.
- Εκτυπώστε τα περιεχόμενα του χάρτη my_map στην κονσόλα.
- Το πρόγραμμα πρέπει να επιστρέψει την έξοδο μετά την επιτυχή ολοκλήρωση.
- Τέλος του σώματος της συνάρτησης main().






