Junior
Mis vahe on map ja unordered_map konteineritel C++-s?
sobes.tech AI
Vastus AI-lt
Peamine erinevus seisneb selles, kuidas elemendid salvestatakse ja välja võetakse:
std::map: Salvestab elemendid võtme järgi sorteeritud järjekorras. Tavaliselt on see realiseeritud punase-musta puu alusel. Otsing, lisamine ja kustutamine on logaritmilise keerukusega O(log N), kus N on elementide arv.std::unordered_map: Salvestab elemendid hajutatud tabelis. Järjekord on juhuslik. Keskmiselt on otsing, lisamine ja kustutamine konstantse keerukusega O(1). Halvimal juhul, kokkulangevuste tõttu, võib keerukus ulatuda O(N)-ni.
| Näitaja | std::map |
std::unordered_map |
|---|---|---|
| Järjekord | Võtme järgi (kasvav) | Ei ole |
| Põhistruktuur | Punase-musta puu | Hajutatud tabel |
| Keskmine keerukus | O(log N) | O(1) |
| Halvim keerukus | O(log N) | O(N) |
| Võtme nõuded | < operaator |
Hash-funktsioon ja == |
Näide kasutamiseks:
#include <map>
#include <unordered_map>
#include <string>
#include <iostream>
int peamine() {
// std::map: elemendid on sorteeritud võtme järgi
std::map<std::string, int> sorteeritud_map;
sorteeritud_map["banaan"] = 3;
sorteeritud_map["õun"] = 1;
sorteeritud_map["kirss"] = 2;
// Väljund: õun 1, banaan 3, kirss 2 (järjekord on oluline)
for (const auto& paar : sorteeritud_map) {
std::cout << paar.first << " " << paar.second << std::endl;
}
std::cout << "---" << std::endl;
// std::unordered_map: elementide järjekord ei ole garanteeritud
std::unordered_map<std::string, int> vaba_map;
vaba_map["banaan"] = 3;
vaba_map["õun"] = 1;
vaba_map["kirss"] = 2;
// Väljund võib olla erinev (näiteks kirss 2, õun 1, banaan 3)
for (const auto& paar : vaba_map) {
std::cout << paar.first << " " << paar.second << std::endl;
}
return 0;
}