Sobes.tech
Middle

C++-da std::set və std::unordered_set nə zaman istifadə edilməlidir?

sobes.tech Süni İntellekt

AI-dan cavab

std::setstd::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::hash funksiyası 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;
}