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;
}