Sobes.tech
Junior

Kāda ir atšķirība starp konteineriem map un unordered_map C++?

sobes.tech AI

Atbilde no AI

Galvenā atšķirība ir tajā, kā elementi tiek glabāti un iegūti:

  • std::map: Glabā elementus pēc atslēgas sakārtotā secībā. Parasti realizēts uz sarkanmelnu koka bāzes. Meklēšana, pievienošana un dzēšana ir logaritmiskas sarežģītības O(log N), kur N ir elementu skaits.
  • std::unordered_map: Glabā elementus haštabulā. Kārtība ir nejauša. Vidēji, meklēšana, pievienošana un dzēšana ir konstantes sarežģītības O(1). Sliktākajā gadījumā, kolīziju dēļ, sarežģītība var sasniegt O(N).
Raksturlielums std::map std::unordered_map
Kārtība Pēc atslēgas (augšana) Nav
Pamatstruktūra Sarkanmelnu koka struktūra Haštabula
Vidējā sarežģītība O(log N) O(1)
Sliktākā sarežģītība O(log N) O(N)
Atslēgas prasības Operator < Hašfunkcija un ==

Piemērs lietošanai:

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

int galvenais() {
    // std::map: elementi sakārtoti pēc atslēgas
    std::map<std::string, int> sakārtots_map;
    sakārtots_map["banāns"] = 3;
    sakārtots_map["ābols"] = 1;
    sakārtots_map["ķirsis"] = 2;

    // Izvade: ābols 1, banāns 3, ķirsis 2 (kārtība ir svarīga)
    for (const auto& pāris : sakārtots_map) {
        std::cout << pāris.first << " " << pāris.second << std::endl;
    }

    std::cout << "---" << std::endl;

    // std::unordered_map: elementu kārtība nav garantēta
    std::unordered_map<std::string, int> brīvs_map;
    brīvs_map["banāns"] = 3;
    brīvs_map["ābols"] = 1;
    brīvs_map["ķirsis"] = 2;

    // Izvade var būt dažāda (piemēram, ķirsis 2, ābols 1, banāns 3)
    for (const auto& pāris : brīvs_map) {
        std::cout << pāris.first << " " << pāris.second << std::endl;
    }

    return 0;
}