Junior
Ποια είναι η διαφορά μεταξύ map και unordered_map στη C++;
sobes.tech AI
Απάντηση από AI
std::map — ένας συσχετιστικός δοχείο που αποθηκεύει ζεύγη "κλειδί-τιμή", ταξινομημένα κατά το κλειδί. Βασίζεται σε ένα κόκκινο-μαύρο δέντρο. Ο χρόνος πρόσβασης, εισαγωγής και διαγραφής στοιχείων είναι λογαριθμικός (O(log n)).
std::unordered_map — ένας συσχετιστικός δοχείο που αποθηκεύει ζεύγη "κλειδί-τιμή" σε έναν πίνακα κατακερματισμού. Τα στοιχεία δεν είναι ταξινομημένα. Ο μέσος χρόνος πρόσβασης, εισαγωγής και διαγραφής στοιχείων είναι σταθερός (O(1)), αλλά στη χειρότερη περίπτωση μπορεί να είναι γραμμικός (O(n)) λόγω συγκρούσεων. Απαιτεί μια συνάρτηση κατακερματισμού για τον τύπο κλειδιού και έναν τελεστή σύγκρισης ισότητας (operator==).
| Χαρακτηριστικό | std::map |
std::unordered_map |
|---|---|---|
| Βάση | Κόκκινο-μαύρο δέντρο | Πίνακας κατακερματισμού |
| Ταξινόμηση στοιχείων | Κατά το κλειδί | Όχι |
| Μέση πολυπλοκότητα λειτουργιών (πρόσβαση, εισαγωγή, διαγραφή) | O(log n) | O(1) |
| Χειρότερη πολυπλοκότητα | O(log n) | O(n) (σε συγκρούσεις) |
| Απαιτήσεις για το κλειδί | < τελεστής |
Συνάρτηση κατακερματισμού, == τελεστής |
| Κατανάλωση μνήμης | Περισσότερη | Λιγότερη (μέσος όρος, μπορεί να διαφέρει) |
Παράδειγμα χρήσης:
#include <map>
#include <unordered_map>
#include <string>
int main() {
// Χρήση του std::map
std::map<std::string, int> my_map;
my_map["apple"] = 1;
my_map["banana"] = 2;
my_map["orange"] = 3;
// Τα στοιχεία αποθηκεύονται ταξινομημένα κατά το κλειδί (apple, banana, orange)
// Χρήση του std::unordered_map
std::unordered_map<std::string, int> my_unordered_map;
my_unordered_map["apple"] = 1;
my_unordered_map["banana"] = 2;
my_unordered_map["orange"] = 3;
// Τα στοιχεία αποθηκεύονται χωρίς συγκεκριμένη σειρά
return 0;
}