Junior
Ποια είναι η διαφορά μεταξύ των δοχείων map και unordered_map στη C++;
sobes.tech AI
Απάντηση από AI
Η κύρια διαφορά βρίσκεται στον τρόπο αποθήκευσης και ανάκτησης των στοιχείων:
std::map: Αποθηκεύει τα στοιχεία σε ταξινομημένη σειρά με βάση το κλειδί. Συνήθως υλοποιείται με ένα κόκκινο-μαύρο δέντρο. Η αναζήτηση, η εισαγωγή και η διαγραφή έχουν λογαριθμική πολυπλοκότητα O(log N), όπου N είναι ο αριθμός των στοιχείων.std::unordered_map: Αποθηκεύει τα στοιχεία σε έναν πίνακα κατακερματισμού (hash table). Η σειρά των στοιχείων είναι τυχαία. Κατά μέσο όρο, η αναζήτηση, η εισαγωγή και η διαγραφή έχουν σταθερή πολυπλοκότητα O(1). Στην χειρότερη περίπτωση, με συγκρούσεις, η πολυπλοκότητα μπορεί να φτάσει το O(N).
| Χαρακτηριστικό | std::map |
std::unordered_map |
|---|---|---|
| Ταξινόμηση | Με βάση το κλειδί (αύξουσα) | Όχι |
| Βασική δομή | Κόκκινο-μαύρο δέντρο | Πίνακας κατακερματισμού |
| Μέση πολυπλοκότητα | O(log N) | O(1) |
| Χειρότερη περίπτωση | O(log N) | O(N) |
| Απαιτήσεις για το κλειδί | Τελεστής < |
Συνάρτηση κατακερματισμού και == |
Παράδειγμα χρήσης:
#include <map>
#include <unordered_map>
#include <string>
#include <iostream>
int main() {
// std::map: στοιχεία ταξινομημένα κατά κλειδί
std::map<std::string, int> sorted_map;
sorted_map["banana"] = 3;
sorted_map["apple"] = 1;
sorted_map["cherry"] = 2;
// Έξοδος: apple 1, banana 3, cherry 2 (η σειρά είναι σημαντική)
for (const auto& pair : sorted_map) {
std::cout << pair.first << " " << pair.second << std::endl;
}
std::cout << "---" << std::endl;
// std::unordered_map: η σειρά των στοιχείων δεν εγγυάταιται
std::unordered_map<std::string, int> unordered_map;
unordered_map["banana"] = 3;
unordered_map["apple"] = 1;
unordered_map["cherry"] = 2;
// Η έξοδος μπορεί να διαφέρει (π.χ., cherry 2, apple 1, banana 3)
for (const auto& pair : unordered_map) {
std::cout << pair.first << " " << pair.second << std::endl;
}
return 0;
}