Πώς να χρησιμοποιήσετε το C ++ Unordered Map

How Use C Unordered Map



Ένας χάρτης, επίσης γνωστός ως συσχετιστικός πίνακας είναι μια λίστα στοιχείων, όπου κάθε στοιχείο είναι ένα ζεύγος κλειδιού/τιμής. Έτσι, κάθε κλειδί αντιστοιχεί σε μια τιμή. Διαφορετικά κλειδιά μπορεί να έχουν την ίδια τιμή, για συνηθισμένη εργασία. Για παράδειγμα, τα κλειδιά μπορεί να είναι μια λίστα φρούτων και οι αντίστοιχες τιμές, τα χρώματα των φρούτων. Στο C ++, ο χάρτης υλοποιείται ως δομή δεδομένων με λειτουργίες και τελεστές μελών. Ένας διατεταγμένος χάρτης είναι αυτός όπου τα ζεύγη στοιχείων έχουν ταξινομηθεί με κλειδιά. Χάρτης χωρίς τάξη είναι εκείνος όπου δεν υπάρχει παραγγελία. Αυτό το άρθρο εξηγεί τον τρόπο χρήσης του μη ταξινομημένου χάρτη C ++, γραμμένο ως unordered_map. Χρειάζεστε γνώση σε δείκτες C ++ για να κατανοήσετε αυτό το άρθρο. Το unordered_map είναι μέρος της τυπικής βιβλιοθήκης C ++.

Τάξη και Αντικείμενα

Μια κλάση είναι ένα σύνολο μεταβλητών και συναρτήσεων που λειτουργούν μαζί, όπου οι μεταβλητές δεν έχουν τιμές εκχωρημένες. Όταν εκχωρούνται τιμές στις μεταβλητές, η κλάση γίνεται αντικείμενο. Διαφορετικές τιμές που δίνονται στην ίδια κλάση οδηγούν σε διαφορετικά αντικείμενα. δηλαδή, διαφορετικά αντικείμενα έχουν την ίδια κλάση με διαφορετικές τιμές. Η δημιουργία ενός αντικειμένου από μια κλάση λέγεται ότι δημιουργεί το αντικείμενο.







Το όνομα, unordered_map, είναι μια κλάση. Ένα αντικείμενο που δημιουργήθηκε από την τάξη unordered_map έχει ένα όνομα προγραμματιστή που έχει επιλεγεί.



Μια συνάρτηση που ανήκει σε μια κλάση είναι απαραίτητη για την παρουσίαση ενός αντικειμένου από την κλάση. Στο C ++, αυτή η συνάρτηση έχει το ίδιο όνομα με το όνομα της κλάσης. Τα αντικείμενα που δημιουργήθηκαν (ενδεικτικά) από την τάξη έχουν διαφορετικά ονόματα που τους δόθηκαν από τον προγραμματιστή.



Η δημιουργία ενός αντικειμένου από την κλάση σημαίνει την κατασκευή του αντικειμένου. σημαίνει επίσης ενσάρκωση.





Ένα πρόγραμμα C ++ που χρησιμοποιεί την τάξη unordered_map, ξεκινά με τις ακόλουθες γραμμές στο επάνω μέρος του αρχείου:

#περιλαμβάνω
#περιλαμβάνω
χρησιμοποιώντας το όνομα χώρου std?

Η πρώτη γραμμή είναι για είσοδο/έξοδο. Η δεύτερη γραμμή είναι να επιτρέπεται στο πρόγραμμα να χρησιμοποιεί όλες τις δυνατότητες της κλάσης unordered_map. Η τρίτη γραμμή επιτρέπει στο πρόγραμμα να χρησιμοποιεί τα ονόματα στον τυπικό χώρο ονομάτων.



Υπερφόρτωση μιας λειτουργίας

Όταν δύο ή περισσότερες διαφορετικές υπογραφές συνάρτησης έχουν το ίδιο όνομα, αυτό το όνομα λέγεται ότι είναι υπερφορτωμένο. Όταν καλείται μία συνάρτηση, ο αριθμός και ο τύπος των ορισμάτων, καθορίζουν ποια συνάρτηση εκτελείται στην πραγματικότητα.

Κατασκευή/Κατασκευή αντιγράφων

Απλή Κατασκευή

Ένας μη ταξινομημένος χάρτης μπορεί να κατασκευαστεί και να εκχωρηθούν τιμές ως εξής:

unordered_map<const απανθρακώνω*, const απανθρακώνω*>ουμαπ?

ουμαπ['μπανάνα'] = 'κίτρινος'?
ουμαπ['σταφύλι'] = 'πράσινος'?
ουμαπ['Σύκο'] = 'μωβ'?

Η δήλωση ξεκινά με την εξειδίκευση προτύπου με τους τύπους για τα ζεύγη κλειδιών και τιμών. Ακολουθεί το επιλεγμένο όνομα του προγραμματιστή για τον χάρτη. μετά ένα ερωτηματικό. Το δεύτερο τμήμα κώδικα δείχνει τον τρόπο εκχώρησης τιμών στα κλειδιά τους.
Κατασκευή από Initializer_list
Αυτό μπορεί να γίνει ως εξής:

unordered_map<const απανθρακώνω*, const απανθρακώνω*>ουμαπ({{'μπανάνα', 'κίτρινος'},
{'σταφύλι', 'πράσινος'}, {'Σύκο', 'μωβ'}})?

Κατασκευή με ανάθεση Initializer_list
Παράδειγμα:

unordered_map<const απανθρακώνω*, const απανθρακώνω*>ουμαπ= {{'μπανάνα', 'κίτρινος'},
{'σταφύλι', 'πράσινος'}, {'Σύκο', 'μωβ'}}?

Κατασκευή με αντιγραφή άλλου unordered_map
Παράδειγμα:

unordered_map<const απανθρακώνω*, const απανθρακώνω*>umap1({{'μπανάνα', 'κίτρινος'},
{'σταφύλι', 'πράσινος'}, {'Σύκο', 'μωβ'}})?
unordered_map<const απανθρακώνω*, const απανθρακώνω*>umap2(umap1)?

Το ζευγάρι Element

Ο ακόλουθος κώδικας δείχνει τον τρόπο δημιουργίας και πρόσβασης στο στοιχείο ζεύγους:

ζεύγος<απανθρακώνω, const απανθρακώνω*>πρ= {'ρε', 'είναι'}?
κόστος<<πρ.πρώτα << ' n'?
κόστος<<πρ.δεύτερος << ' n'?

Η έξοδος είναι:

ρε
είναι

το πρώτο και το δεύτερο είναι δεσμευμένες λέξεις για τα δύο στοιχεία του ζεύγους. Οι τιμές στο ζεύγος μπορούν ακόμα να αλλάξουν χρησιμοποιώντας το πρώτο και το δεύτερο.

Ένα ζεύγος καλείται, value_type στο θέμα του μη ταξινομημένου χάρτη.

unordered_map Πρόσβαση στο στοιχείο

mapped_type & operator [] (key_type && k)
Επιστρέφει την τιμή για το αντίστοιχο κλειδί. Παράδειγμα:

unordered_map<const απανθρακώνω*, const απανθρακώνω*>ουμαπ?

ουμαπ['μπανάνα'] = 'κίτρινος'?
ουμαπ['σταφύλι'] = 'πράσινος'?
ουμαπ['Σύκο'] = 'μωβ'?

const απανθρακώνω *σωστά=ουμαπ['σταφύλι']?

κόστος<<σωστά<<' n'?

Η έξοδος είναι: πράσινη. Οι τιμές μπορούν να αποδοθούν με τον ίδιο τρόπο - δείτε παραπάνω.

unordered_map Χωρητικότητα

size_type size () const noexcept
Επιστρέφει τον αριθμό των ζευγαριών στο χάρτη.

unordered_map<const απανθρακώνω*, const απανθρακώνω*>ουμαπ?

ουμαπ['μπανάνα'] = 'κίτρινος'?
ουμαπ['σταφύλι'] = 'πράσινος'?
ουμαπ['Σύκο'] = 'μωβ'?

κόστος<<ουμαπ.Μέγεθος() <<' n'?

Η έξοδος είναι 3.

bool κενό () const noexcept

Επιστρέφει 1 για αληθές εάν ο χάρτης δεν έχει ζεύγος και 0 για ψευδές εάν έχει ζεύγη. Παράδειγμα:

unordered_map<const απανθρακώνω*, const απανθρακώνω*>ουμαπ?
κόστος<<ουμαπ.αδειάζω() <<' n'?

Η έξοδος είναι 1.

Επιστρέφοντας επαναλήπτες και η τάξη μη ταξινομημένου χάρτη

Ένας επαναληπτής είναι σαν δείκτης αλλά έχει περισσότερη λειτουργικότητα από τον δείκτη.

Έναρξη () χωρίς εξαίρεση

Επιστρέφει έναν επαναληπτή που δείχνει το πρώτο ζεύγος του αντικειμένου χάρτη, όπως στο ακόλουθο τμήμα κώδικα:

unordered_map<const απανθρακώνω*, const απανθρακώνω*>ουμαπ?

ουμαπ['μπανάνα'] = 'κίτρινος'?ουμαπ['σταφύλι'] = 'πράσινος'?ουμαπ['Σύκο'] = 'μωβ'?

unordered_map<const απανθρακώνω*, const απανθρακώνω*> ::επαναληπτηςiter=ουμαπ.να αρχίσει()?
ζεύγος<const απανθρακώνω*, const απανθρακώνω*>πρ= *iter?
κόστος<<πρ.πρώτα << ',' <<πρ.δεύτερος << ' n'?

Η έξοδος είναι: σύκο, μοβ. Ο χάρτης είναι χωρίς παραγγελία.

Έναρξη () const noexcept?

Επιστρέφει έναν επαναληπτή που δείχνει το πρώτο στοιχείο της συλλογής αντικειμένων χάρτη. Όταν προηγείται η κατασκευή του αντικειμένου από const, η έκφραση begin () const εκτελείται αντί να ξεκινήσει (). Υπό αυτή τη συνθήκη, τα στοιχεία στο αντικείμενο δεν μπορούν να τροποποιηθούν. Χρησιμοποιείται, για παράδειγμα, στον ακόλουθο κώδικα.

constunordered_map<const απανθρακώνω*, const απανθρακώνω*>ουμαπ({{'μπανάνα', 'κίτρινος'},
{'σταφύλι', 'πράσινος'}, {'Σύκο', 'μωβ'}})?

unordered_map<const απανθρακώνω*, const απανθρακώνω*> ::const_iteratoriter=ουμαπ.να αρχίσει()?
ζεύγος<const απανθρακώνω*, const απανθρακώνω*>πρ= *iter?
κόστος<<πρ.πρώτα << ',' <<πρ.δεύτερος << ' n'?

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

τέλος () εκτός

Επιστρέφει έναν επαναληπτή που δείχνει αμέσως πέρα ​​από το τελευταίο στοιχείο του αντικειμένου του χάρτη.

end () const noexcept

Επιστρέφει έναν επαναληπτή που δείχνει αμέσως πέρα ​​από το τελευταίο στοιχείο του αντικειμένου του χάρτη. Όταν προηγείται η κατασκευή του αντικειμένου χάρτη με const, η παράσταση end () const εκτελείται αντί για end ().

unordered_map Λειτουργίες

εύρεση iterator (const__τύπος κλειδιού & k)

Αναζητά ένα ζευγάρι του δεδομένου κλειδιού στο χάρτη. Εάν βρεθεί, επιστρέφει τον επαναληπτή. Εάν δεν βρεθεί, επιστρέφει έναν επαναληπτή που δείχνει στο τέλος του χάρτη, ο οποίος δεν είναι ζεύγος. Ο παρακάτω κώδικας δείχνει τον τρόπο χρήσης αυτής της συνάρτησης μέλους:

unordered_map<απανθρακώνω,απανθρακώνω>>ουμαπ?

ουμαπ['προς το'] = 'σι'?ουμαπ['ντο'] = 'ρε'?ουμαπ['Και'] = 'φά'?

unordered_map<απανθρακώνω,απανθρακώνω> ::επαναληπτηςiter=ουμαπ.εύρημα('ντο')?
αν (ουμαπ.εύρημα('ντο') ! = =ουμαπ.τέλος())
{
ζεύγος<απανθρακώνω,απανθρακώνω>>πρ= *iter?
κόστος<<πρ.πρώτα << ',' <<πρ.δεύτερος << ' n'?
}

Η έξοδος είναι: c, d

const_iterator εύρεση (const key_type & k) const;

Αυτή η έκδοση της συνάρτησης καλείται, εάν η δημιουργία του μη ταξινομημένου χάρτη αρχίζει με const, καθιστώντας όλα τα στοιχεία του χάρτη μόνο για ανάγνωση.

unordered_map Τροποποιητές

ζεύγος ένθετο (value_type && obj)
Ένας μη ταξινομημένος χάρτης σημαίνει ότι τα ζευγάρια δεν έχουν καμία σειρά. Έτσι, το πρόγραμμα εισάγει το ζευγάρι σε οποιοδήποτε μέρος βρίσκει βολικό. Η συνάρτηση επιστρέφει, ζεύγος. Εάν η εισαγωγή ήταν επιτυχής, το bool θα είναι 1 για true, αλλιώς θα ήταν 0 για false. Εάν η εισαγωγή είναι επιτυχής, τότε ο επαναλήπτης θα δείξει το στοιχείο που εισήχθη πρόσφατα. Ο παρακάτω κώδικας απεικονίζει τη χρήση:

unordered_map<const απανθρακώνω*, const απανθρακώνω*>ουμαπ?

ουμαπ['μπανάνα'] = 'κίτρινος'?
ουμαπ['σταφύλι'] = 'πράσινος'?
ουμαπ['Σύκο'] = 'μωβ'?

ουμαπ.εισάγετε({{'κεράσι', 'καθαρά'}, {'φράουλα', 'καθαρά'}})?

κόστος<<ουμαπ.Μέγεθος() << ' n'?

Η έξοδος είναι: 5. Μπορούν να εισαχθούν περισσότερα από ένα ζεύγη.

διαγραφή μεγέθους_τύπου (const_type key & k)

Αυτή η συνάρτηση διαγράφει ένα ζεύγος από το unordered_map. Το ακόλουθο τμήμα κώδικα απεικονίζει:

unordered_map<const απανθρακώνω*, const απανθρακώνω*>ουμαπ?

ουμαπ['μπανάνα'] = 'κίτρινος'?
ουμαπ['σταφύλι'] = 'πράσινος'?
ουμαπ['Σύκο'] = 'μωβ'?

intσε ένα=ουμαπ.εξάλειψη('σταφύλι')?

κόστος<<ουμαπ.Μέγεθος() << ' n'?

Η έξοδος είναι 2.
void swap (unordered_map &)
Δύο μη ταξινομημένοι χάρτες μπορούν να αλλάξουν, όπως απεικονίζεται σε αυτό το τμήμα κώδικα:

unordered_map<const απανθρακώνω*, const απανθρακώνω*>umap1= {{'μπανάνα', 'κίτρινος'},
{'σταφύλι', 'πράσινος'}, {'Σύκο', 'μωβ'}, {'φράουλα', 'καθαρά'}}?

unordered_map<const απανθρακώνω*, const απανθρακώνω*>umap2= {{'κεράσι', 'καθαρά'}, {'άσβεστος', 'πράσινος'}}?

umap1.ανταλαγή(umap2)?

unordered_map<const απανθρακώνω*, const απανθρακώνω*> ::επαναληπτηςiter1=umap1.να αρχίσει()?
ζεύγος<const απανθρακώνω*, const απανθρακώνω*>pr1= *iter1?
unordered_map<const απανθρακώνω*, const απανθρακώνω*> ::επαναληπτηςiter2=umap2.να αρχίσει()?
ζεύγος<const απανθρακώνω*, const απανθρακώνω*>pr2= *iter2?

κόστος<< 'Πρώτο κλειδί και μέγεθος umap1:'<<pr1.πρώτα <<','<<umap1.Μέγεθος() << ' n'?
κόστος<< 'Πρώτο κλειδί και μέγεθος umap2'<<pr2.πρώτα <<','<<umap2.Μέγεθος() << ' n'?
unordered_map<const απανθρακώνω*, const απανθρακώνω*>umap1= {{'μπανάνα', 'κίτρινος'},
{'σταφύλι', 'πράσινος'}, {'Σύκο', 'μωβ'}, {'φράουλα', 'καθαρά'}}?
unordered_map<const απανθρακώνω*, const απανθρακώνω*>umap2= {{'κεράσι', 'καθαρά'}, {'άσβεστος', 'πράσινος'}}?

umap1.ανταλαγή(umap2)?

unordered_map<const απανθρακώνω*, const απανθρακώνω*> ::επαναληπτηςiter1=umap1.να αρχίσει()?
ζεύγος<const απανθρακώνω*, const απανθρακώνω*>pr1= *iter1?
unordered_map<const απανθρακώνω*, const απανθρακώνω*> ::επαναληπτηςiter2=umap2.να αρχίσει()?
ζεύγος<const απανθρακώνω*, const απανθρακώνω*>pr2= *iter2?

κόστος<< 'Πρώτο κλειδί και μέγεθος umap1:'<<pr1.πρώτα <<','<<umap1.Μέγεθος() << ' n'?
κόστος<< 'Πρώτο κλειδί και μέγεθος umap2'<<pr2.πρώτα <<','<<umap2.Μέγεθος() << ' n'?

Η έξοδος είναι:

Πρώτο κλειδί και μέγεθος umap1: ασβέστη, 2

Πρώτο κλειδί και μέγεθος φράουλας umap2, 4

Ο χάρτης είναι χωρίς παραγγελία. Σημειώστε ότι το μήκος ενός χάρτη αυξάνεται εάν είναι απαραίτητο. Οι τύποι δεδομένων πρέπει να είναι οι ίδιοι.

Η τάξη και τα τεκμηριωμένα αντικείμενά της

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

#περιλαμβάνω
#περιλαμβάνω
χρησιμοποιώντας το όνομα χώρου std?

τάξη TheCla
{
δημόσιο:
intσε ένα?
στατικός απανθρακώνωκεφ?

κενόςλειτουργία(απανθρακώνωόχι, const απανθρακώνω *Π)
{
κόστος<< 'Υπάρχουν ' <<σε ένα<< 'αξίζει βιβλία' <<όχι<<Π<< ' στο μαγαζί.' << ' n'?
}
στατικός κενόςδιασκέδαση(απανθρακώνωκεφ)
{
αν (κεφ== 'προς το')
κόστος<< «Επίσημη λειτουργία στατικών μελών» << ' n'?
}
}?

intκύριος()
{
TheCla obj1?TheCla obj2?TheCla obj3?TheCla obj4?TheCla obj5?

unordered_map<const απανθρακώνω*,TheCla>>ουμαπ?
ουμαπ= {{'μπανάνα',obj1}, {'σταφύλι',obj2}, {'Σύκο',obj3}, {'φράουλα',obj4}, {'άσβεστος',obj5}}?

κόστος<<ουμαπ.Μέγεθος() << ' n'?

ΕΠΙΣΤΡΟΦΗ 0?
}

Η έξοδος είναι: 5.

Ο ορισμός της κλάσης έχει δύο δημόσια μέλη δεδομένων και δύο δημόσιες λειτουργίες μελών. Στην κύρια συνάρτηση (), δημιουργούνται διαφορετικά αντικείμενα για την κλάση. Στη συνέχεια, δημιουργείται ένας μη ταξινομημένος χάρτης, όπου κάθε ζευγάρι αποτελείται από το όνομα ενός φρούτου και ενός αντικειμένου από την κλάση. Εμφανίζεται το μέγεθος του χάρτη. Το πρόγραμμα μεταγλωττίζεται χωρίς προειδοποίηση ή μήνυμα σφάλματος.

Εφαρμογή του Χάρτη

Ο πίνακας συσχετίζει ένα ευρετήριο με τιμή. Τα ζεύγη κλειδιών/τιμών υπάρχουν σε πολλές καταστάσεις στη ζωή, οι οποίες μπορούν να προγραμματιστούν. Το ζεύγος κλειδιού/τιμής φρούτων/χρώματος είναι μόνο ένα παράδειγμα. Ένα άλλο παράδειγμα είναι το όνομα των ανθρώπων και οι ηλικίες τους. Σε αυτή την περίπτωση, το ζεύγος θα είναι ενός τύπου, ζεύγους. Μπορεί επίσης να είναι ζευγάρι. Στην τελευταία περίπτωση, θα χρησιμοποιηθεί η οδηγία για την προεπεξεργασία. Ένα ζεύγος κλειδιού/αξίας μπορεί να εξακολουθεί να είναι τα ονόματα των παντρεμένων ζευγαριών. Σε χώρες όπου υπάρχει πολυγαμία, θα υπάρχουν διαφορετικές σύζυγοι για έναν άντρα.

Σχηματισμός χάρτη

Ένας χάρτης δεν είναι ένας δισδιάστατος πίνακας, με δύο στήλες. Ένας χάρτης λειτουργεί με λειτουργία κατακερματισμού. Το κλειδί κωδικοποιείται από τη συνάρτηση κατακερματισμού, σε ακέραιο αριθμό πίνακα. Είναι αυτός ο πίνακας που περιέχει τις τιμές. Έτσι, υπάρχει στην πραγματικότητα ένας πίνακας με τις τιμές και τα κλειδιά αντιστοιχίζονται στους δείκτες του πίνακα και έτσι γίνονται οι αντιστοιχίες μεταξύ κλειδιών και τιμών. Το Hashing είναι ένα εκτενές θέμα και δεν καλύπτεται σε αυτό το άρθρο.

συμπέρασμα

Ένας χάρτης, επίσης γνωστός ως συσχετιστικός πίνακας είναι μια λίστα στοιχείων, όπου κάθε στοιχείο είναι ένα ζεύγος κλειδιού/τιμής. Έτσι, κάθε κλειδί αντιστοιχεί σε μια τιμή. Στο C ++, ο χάρτης υλοποιείται ως δομή δεδομένων με λειτουργίες και τελεστές μελών. Ένας διατεταγμένος χάρτης είναι αυτός όπου τα ζεύγη στοιχείων έχουν ταξινομηθεί με κλειδιά. Ένας μη ταξινομημένος χάρτης είναι αυτός όπου δεν υπάρχει παραγγελία.

Τεχνικά, ένα hash αποτελείται από στοιχεία ζεύγους. Στην πραγματικότητα, το ζεύγος είναι μια ολόκληρη δομή δεδομένων με τις λειτουργίες και τους τελεστές μελών του. Οι δύο παράμετροι προτύπου για το ζεύγος είναι οι ίδιες δύο παράμετροι προτύπου για το unordered_map.

Η λίστα αρχικοποίησης για τον χάρτη είναι ένας κυριολεκτικός πίνακας κυριολεκτικών. Κάθε εσωτερική κυριολεκτική αποτελείται από δύο αντικείμενα, το ζεύγος κλειδιού/τιμής.

Οι συναρτήσεις μελών και οι τελεστές για το unordered_map μπορούν να κατηγοριοποιηθούν στις ακόλουθες επικεφαλίδες: unordered_map construction/κατασκευή αντιγράφων, unordered_map Capacity, unordered_map iterator, unordered_map Operations και unordered_map Modifiers.

Ένας μη ταξινομημένος χάρτης χρησιμοποιείται όταν ένα κλειδί πρέπει να αντιστοιχιστεί σε μια τιμή.

Chrys