Sobes.tech
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;
}