Middle
C++-da std::set və std::unordered_set nə zaman istifadə edilməlidir?
sobes.tech Süni İntellekt
AI-dan cavab
std::set və std::unordered_set unikal elementləri saxlamaq üçün istifadə olunur. Aralarındakı seçim prioritetlərdən asılıdır: sıralama və ya giriş/əlavə etmə/silmə performansı.
std::set balanslı ikili axtarış ağacına əsaslanır (adətən qırmızı-qara ağac).
std::set-in xüsusiyyətləri:
- Elementlər sıralanmış qaydada saxlanılır.
- Elementlərin əlavə olunması, silinməsi və axtarışı orta hesabla O(log N) vaxt alır, burada N elementlərin sayıdır.
- Əgər elementlərin sıralanmış ardıcıllığı vacibdirsə və ya müəyyən bir intervalda elementlər əldə etmək lazımdırsa uyğundur.
std::unordered_set hash cədvəlinə əsaslanır.
std::unordered_set-in xüsusiyyətləri:
- Elementlər sıralanmış qaydada saxlanmır.
- Elementlərin əlavə olunması, silinməsi və axtarışı orta hesabla O(1) vaxt alır, lakin ən pis halda (hash funksiyasında çox sayda toqquşma) O(N)-ə çata bilər.
- Elementin tipi üçün
std::hashfunksiyası vəoperator==operatoru müəyyən edilməlidir. - Ən sürətli əlavə, silmə və axtarış tələb olunan və elementlərin sıralanmasının önəmli olmadığı hallara uyğundur.
Xülasə cədvəli:
| Kriteriya | std::set |
std::unordered_set |
|---|---|---|
| Daxili struktur | Balanslı ağac | Hash cədvəli |
| Elementlərin sıralanması | Sıralanmış | Sıralanmamış |
| Orta hesabla axtarış/əlavə/silme vaxtı | O(log N) | O(1) |
| Ən pis halda vaxt | O(log N) | O(N) |
| Tip tələbləri | < operatoru |
std::hash, operator== |
std::set istifadə nümunəsi:
#include <iostream>
#include <set>
int main() {
std::set<int> sıralı_set;
sıralı_set.insert(5);
sıralı_set.insert(2);
sıralı_set.insert(8);
// Elementlər sıralı şəkildə çıxarılır: 2 5 8
for (int dəyər : sıralı_set) {
std::cout << dəyər << " ";
}
std::cout << std::endl;
return 0;
}
std::unordered_set istifadə nümunəsi:
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> sırasız_set;
sırasız_set.insert(5);
sırasız_set.insert(2);
sırasız_set.insert(8);
// Çıxış sırası dəyişə bilər
for (int dəyər : sırasız_set) {
std::cout << dəyər << " ";
}
std::cout << std::endl;
return 0;
}