Sobes.tech
Junior

Kuo skiriasi map ir unordered_map C++?

sobes.tech AI

Atsakymas iš AI

std::map — asociatyvus konteineris, saugantis poras "raktas-reikšmė" ir išrikiuotas pagal raktą. Pagrįstas raudonai-juoda medžio struktūra. Prieigos, įterpimo ir ištrynimo laikas yra logaritminis (O(log n)).

std::unordered_map — asociatyvus konteineris, saugantis poras "raktas-reikšmė" hash lentelėje. Elementai nėra išrikiuoti. Vidutinis prieigos, įterpimo ir ištrynimo laikas yra pastovus (O(1)), bet blogiausiu atveju gali būti linijinis (O(n)) dėl kolizijų. Reikalauja hash funkcijos raktų tipui ir lyginimo operatoriaus (operator==).

Savybė std::map std::unordered_map
Pagrindas Raudonai-juoda medis Hash lentelė
Elementų rūšiavimas Pagal raktą Nėra
Vidutinė operacijų sudėtingumas (prieiga, įterpimas, ištrynimas) O(log n) O(1)
Blogiausias operacijų sudėtingumas (prieiga, įterpimas, ištrynimas) O(log n) O(n) (kolizijų atveju)
Raktų reikalavimai < operatorius Hash funkcija, == operatorius
Atminties suvartojimas Daugiau Mažiau (vidutiniškai, bet gali skirtis)

Pavyzdys naudojimo:

#include <map>
#include <unordered_map>
#include <string>

int main() {
    // Naudojant std::map
    std::map<std::string, int> mano_map;
    mano_map["apple"] = 1;
    mano_map["banana"] = 2;
    mano_map["orange"] = 3;
    // Elementai saugomi išrikiuoti pagal raktą (apple, banana, orange)

    // Naudojant std::unordered_map
    std::unordered_map<std::string, int> mano_neišrikiuotas_map;
    mano_neišrikiuotas_map["apple"] = 1;
    mano_neišrikiuotas_map["banana"] = 2;
    mano_neišrikiuotas_map["orange"] = 3;
    // Elementai saugomi be nustatyto tvarkos
    
    return 0;
}