Sobes.tech
Middle

C++'ta std::set ve std::unordered_set ne zaman kullanılmalı?

sobes.tech yapay zeka

AI'dan gelen yanıt

std::set ve std::unordered_set, benzersiz öğeleri depolamak için kullanılır. Aralarındaki seçim, önceliklere bağlıdır: sıralama veya erişim/ekleme/silme performansı.

std::set, dengelenmiş ikili arama ağacına dayanır (genellikle kırmızı-siyah ağaç).

std::set özellikleri:

  • Öğeler sıralı bir düzen içinde saklanır.
  • Öğelerin eklenmesi, silinmesi ve aranması ortalama O(log N) zaman alır, burada N öğe sayısıdır.
  • Öğelerin sıralı düzeni önemliyse veya belirli bir aralıkta öğe almak gerekiyorsa uygundur.

std::unordered_set, bir karma tabloya dayanır.

std::unordered_set özellikleri:

  • Öğeler sıralı değildir.
  • Öğelerin eklenmesi, silinmesi ve aranması ortalama O(1) zaman alır, ancak en kötü durumda (çok sayıda çakışma varsa) O(N) olabilir.
  • Öğenin türünün bir hash fonksiyonuna (std::hash) ve eşitlik karşılaştırma operatörüne (operator==) sahip olması gerekir.
  • En hızlı ekleme, silme ve arama işlemleri gerektiğinde ve öğelerin sıralamasının önemli olmadığı durumlar için uygundur.

Özet tablo:

Kriter std::set std::unordered_set
İç yapı Dengelenmiş ağaç Karma tablo
Öğelerin sıralanması Sıralı Sırasız
Ortalama arama/ekleme/silme süresi O(log N) O(1)
En kötü durumda arama/ekleme/silme süresi O(log N) O(N)
Tür gereksinimleri < operatörü std::hash, operator==

std::set kullanımı örneği:

#include <iostream>
#include <set>

int main() {
    std::set<int> ordered_set;
    ordered_set.insert(5);
    ordered_set.insert(2);
    ordered_set.insert(8);

    // Öğeler sıralı olarak yazdırılır: 2 5 8
    for (int val : ordered_set) {
        std::cout << val << " ";
    }
    std::cout << std::endl;

    return 0;
}

std::unordered_set kullanımı örneği:

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> unordered_set;
    unordered_set.insert(5);
    unordered_set.insert(2);
    unordered_set.insert(8);

    // Çıktı sırası değişebilir
    for (int val : unordered_set) {
        std::cout << val << " ";
    }
    std::cout << std::endl;

    return 0;
}