Sobes.tech
Junior

C++-də map və unordered_map konteynerləri arasındakı fərq nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Əsas fərq elementlərin necə saxlanılması və alınması ilə bağlıdır:

  • std::map: Elementləri açar üzrə sıralanmış qaydada saxlayır. Adətən, qırmızı-qara ağac əsasında həyata keçirilir. Axtarış, əlavə və silmə əməliyyatlarının logarifmik mürəkkəbliyi O(log N)-dir, burada N elementlərin sayıdır.
  • std::unordered_map: Elementləri hash cədvəlində saxlayır. Elementlərin sırası təsadüfi olur. Orta hesabla, axtarış, əlavə və silmə əməliyyatları O(1) sabit mürəkkəbliyə malikdir. Ən pis halda, kolliziya baş verdikdə, mürəkkəblik O(N)-ə qədər arta bilər.
Xüsusiyyət std::map std::unordered_map
Sıralama Açar üzrə (artma sıralama) Xeyr
Əsas struktur Qırmızı-qara ağac Hash cədvəl
Orta mürəkkəblik O(log N) O(1)
Ən pis halda O(log N) O(N)
Açar tələbləri Operator < Hash funksiyası və ==

İstifadə nümunəsi:

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

int main() {
    // std::map: elementlər açar üzrə sıralanıb
    std::map<std::string, int> sorted_map;
    sorted_map["banana"] = 3;
    sorted_map["apple"] = 1;
    sorted_map["cherry"] = 2;

    // Çıxış: apple 1, banana 3, cherry 2 (sıra vacibdir)
    for (const auto& pair : sorted_map) {
        std::cout << pair.first << " " << pair.second << std::endl;
    }

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

    // std::unordered_map: elementlərin sırası təmin edilmir
    std::unordered_map<std::string, int> unordered_map;
    unordered_map["banana"] = 3;
    unordered_map["apple"] = 1;
    unordered_map["cherry"] = 2;

    // Çıxış fərqli ola bilər (məsələn, cherry 2, apple 1, banana 3)
    for (const auto& pair : unordered_map) {
        std::cout << pair.first << " " << pair.second << std::endl;
    }

    return 0;
}