| Both sides previous revision
Previous revision
Next revision
|
Previous revision
|
cpp:stl:map [2020/05/31 06:53] gthanos |
cpp:stl:map [2020/06/01 06:13] |
| ====== std::map και std::multimap ====== | |
| |
| Ένα [[http://www.cplusplus.com/reference/map/map/|std::map]] αποτελεί ένα σύνολο μοναδικών στοιχείων, όπου κάθε τέτοιο στοιχείο αποτελεί κλειδί για την εύρεση-αντιστοίχιση με ένα άλλο αντικείμενο που ονομάζουμε "τιμή" (//value//). Κάθε κλειδί προσδιορίζει μοναδικά μία "τιμή", η οποία δεν είναι απαραίτητο να είναι μοναδική (οι τιμές μπορεί να επαναλαμβάνονται). | |
| |
| Τα στοιχεία-κλειδιά αποθηκεύονται εσωτερικά σε ένα ισοζυγισμένο δέντρο αναζητήσεως (π.χ.[[wp>Red–black_tree]], [[wp>AVL_tree]]), όπως ακριβώς και στο [[cpp:stl:set|std::set]]. | |
| |
| Η κατάταξη ενός νέου στοιχείου-κλειδιού γίνεται πάντα μέσω σύγκρισης με τα υπόλοιπα στοιχεία που είναι αποθηκευμένα στην δομή. Για τον λόγο αυτό, απαραίτητη προϋπόθεση για τη λειτουργία του //map// (όπως και στο [[cpp:stl:set|std::set]]) είναι για τον τύπο του κλειδιού να παρέχονται οι τελεστές σύγκρισης %%<%% και %%>%%. Δύο κλειδιά ιδίου τύπου θεωρούνται ίσα σε ένα //map// εάν η παρακάτω λογική έκφραση είναι αληθής. | |
| |
| <code cpp> | |
| if(!(a < b) && !(b < a)) | |
| </code> | |
| |
| Ένα [[http://www.cplusplus.com/reference/map/multimap/|std::multimap]] αποτελεί ένα σύνολο από όχι απαραίτητα μοναδικά κλειδιά, τα οποία είναι αποθηκευμένα σε ένα ισοζυγισμένο δέντρο αναζητήσεως (όπως το //map//). Ο τρόπος σύγκρισης και η κατάταξη των στοιχείων είναι όμοια με την επίπλέον σημείωση ότι το δέντρο επιτρέπει την εμφάνιση ενός κλειδιού περισσότερες από μία φορές. | |
| |
| Στα παρακάτω σχήματα διακρίνεται η δομή ενός [[http://www.cplusplus.com/reference/map/map|std::map]] και ενός [[http://www.cplusplus.com/reference/map/multimap/|std::multimap]], όπου τα κλειδιά είναι ακέραιοι και οι τιμές είναι αντικείμενα τύπου //std::string//. | |
| |
| | {{ :cpp:stl:map01.png? |}}| {{ :cpp:stl:multimap01.png? |}} | | |
| | **Σχήμα 1. std::map** | **Σχήμα 2. std::multimap** | | |
| ===== Επίδοσης της δομής ===== | |
| |
| Η επίδοση της δομής είναι ανάλογη των δομών [[cpp:stl:set|std::set και std::multiset]] λαμβάνοντας υπόψη τα στοιχεία-κλειδιά των //std::map// και //std::multimap//. | |
| |
| ===== Η κλάση std::pair ===== | |
| |
| Προκειμένου να μπορέσει να υπάρξει η αντιστοίχιση μεταξύ στοιχείου-κλειδιού και στοιχείου-τιμής τα δεδομένα σε ένα [[http://www.cplusplus.com/reference/map/map/|std::map]] αντιστοιχίζονται σε ζευγάρια. Η //templated// κλάση της //STL// που υποστηρίζει την αποθήκευση ζευγών δεδομένων είναι η κλάση [[http://www.cplusplus.com/reference/utility/pair/|std::pair]]. Η κλάση μπορεί να αποθηκεύσει δύο αντικείμενα ίδιου ή διαφορετικού τύπου. Στο παράδειγμα που ακολουθεί δημιουργούμε δύο αντικείμενο της κλάσης //std::pair// και προσπελαύνουμε τα στοιχεία τους μέσω των public πεδίων της κλάσης [[http://www.cplusplus.com/reference/utility/pair/|std::pair]] **first** και **second**. | |
| |
| <code cpp pair.cpp> | |
| #include <set> | |
| #include <string> | |
| #include <utility> | |
| #include <iostream> | |
| |
| #include "Student.hpp" | |
| |
| int main() { | |
| std::pair<Student,std::string> peter_pan( | |
| Student("Peter Pan", 1234), | |
| std::string("Wendy House, Neverland") | |
| ); | |
| | |
| std::pair<Student,std::string> mickey_mouse = make_pair( | |
| Student("Mickey Mouse", 1235), | |
| std::string("Walt Disney World Communications, P.O Box 10040, Lake Buena Vista, Florida 32830-0040 ") | |
| ); | |
| | |
| std::cout << peter_pan.first << " -> " << peter_pan.second << std::endl; | |
| std::cout << mickey_mouse.first << " -> " << mickey_mouse.second << std::endl; | |
| } | |
| </code> | |
| |
| <WRAP tip 80% center round> | |
| Εκτός από τον κατασκευαστή της κλάσης [[http://www.cplusplus.com/reference/utility/pair/|std::pair]] υπάρχει και η συνάρτηση [[http://www.cplusplus.com/reference/utility/make_pair/|std::make_pair]], η οποία κατασκευάζει και επιστρέφει ένα αντικείμενο τύπου [[http://www.cplusplus.com/reference/utility/pair/|std::pair]] με βάση τα ορίσματα που λαμβάνει. | |
| </WRAP> | |
| |
| |
| |