Sobes.tech
Junior — Middle

std::unordered_map'ta ачкыч катары колдонулган объекттердин салыштырылышы кандай жүргүзүлөт?

sobes.tech AI

AIден жооп

std::unordered_map объекттеринде ачкычтар (keys) теңдештик функциясы (Equality) аркылуу салыштырылат, ал алдын ала орнотулган std::equal_to<Key> болуп саналат.

Ачкычты кошуу же издөөдө, төмөнкүдөй иш-аракеттер жүргүзүлөт:

  1. Ачкычтын хеш коду хеш-функциясы (өзгөртүүсүз std::hash<Key>) аркылуу эсептелет.
  2. Тийиштүү кофта (bucket) ичинде салыштыруу оператору == же белгиленген теңдештик предикат аркылуу жүргүзүлөт.

Эгер ачкычтар өзгөчө түрлөр болсо, анда:

  • std::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;