Sobes.tech
Junior — Middle

Πώς πραγματοποιείται η σύγκριση αντικειμένων που χρησιμοποιούνται ως κλειδιά στο std::unordered_map;

sobes.tech AI

Απάντηση από AI

Στα αντικείμενα std::unordered_map, τα κλειδιά συγκρίνονται με τη βοήθεια της συνάρτησης ισότητας (Equality), η οποία από προεπιλογή είναι η std::equal_to<Key>.

Κατά την εισαγωγή ή την αναζήτηση ενός κλειδιού, γίνεται:

  1. Υπολογισμός του κωδικού κατακερματισμού (hash code) του κλειδιού με τη χρήση της συνάρτησης hash (από προεπιλογή std::hash<Key>).
  2. Αναζήτηση στο αντίστοιχο κουβά (bucket) με σύγκριση των κλειδιών μέσω του τελεστή == ή ενός ορισμένου προγράμματος σύγκρισης.

Εάν τα κλειδιά είναι προσαρμοσμένοι τύποι, είναι απαραίτητο:

  • Να ορίσετε μια εξειδίκευση του std::hash για αυτόν τον τύπο ή να παρέχετε μια δική σας συνάρτηση hash.
  • Να ορίσετε τον τελεστή == ή να παρέχετε μια δική σας συνάρτηση σύγκρισης.

Παράδειγμα:

struct Key {
    int id;
    bool operator==(const Key& other) const {
        return id == other.id;
    }
};

namespace std {
    template<>
    struct hash<Key> {
        size_t operator()(const Key& k) const {
            return std::hash<int>()(k.id);
        }
    };
}

std::unordered_map<Key, std::string> map;