C++ Academy · Lekcja

std::set

Uporządkowane unikatowe elementy

Lekcja 2 z 413 kroki

std::set to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.

Czym jest std::set?

std::set przechowuje unikatowe elementy w posortowanej kolejności. Duplikaty nie są dozwolone, a wyszukiwanie działa w czasie logarytmicznym.

  • Klucze są jednocześnie wartościami.
  • Kontener świetnie nadaje się do sprawdzania przynależności i usuwania duplikatów.
#include <iostream>
#include <set>

int main() {
    std::set<int> s{3, 1, 2, 1, 3};
    for (int x : s) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

Wstawianie wartości

Do dodawania elementów należy użyć insert(). Próba wstawienia wartości, która już istnieje, jest po prostu ignorowana.

#include <iostream>
#include <set>

int main() {
    std::set<std::string> s;
    s.insert("apple");
    s.insert("banana");
    s.insert("apple");
    std::cout << s.size() << " unique items\n";
    return 0;
}

Wartość zwracana przez insert

insert() zwraca obiekt pair, którego .second jest wartością bool informującą, czy wstawienie rzeczywiście nastąpiło.

#include <iostream>
#include <set>

int main() {
    std::set<int> s{1, 2};
    auto r = s.insert(2);
    std::cout << std::boolalpha << "inserted: " << r.second << '\n';
    auto r2 = s.insert(5);
    std::cout << "inserted: " << r2.second << '\n';
    return 0;
}

Sprawdzanie przynależności

Do sprawdzenia, czy dana wartość występuje, należy użyć count() lub contains() w C++20.

#include <iostream>
#include <set>

int main() {
    std::set<int> s{10, 20, 30};
    std::cout << s.count(20) << '\n';
    std::cout << s.count(99) << '\n';
    return 0;
}

Wyszukiwanie elementów

find() zwraca iterator do pasującego elementu lub end(), jeśli elementu nie ma.

#include <iostream>
#include <set>

int main() {
    std::set<std::string> s{"red", "green", "blue"};
    auto it = s.find("green");
    std::cout << (it != s.end() ? "found" : "missing") << '\n';
    return 0;
}

Usuwanie elementów

erase() usuwa wartość według klucza i zwraca liczbę usuniętych elementów (0 lub 1).

#include <iostream>
#include <set>

int main() {
    std::set<int> s{1, 2, 3, 4};
    s.erase(3);
    for (int x : s) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

Posortowana kolejność

Elementy są zawsze odwiedzane w rosnącej kolejności, niezależnie od kolejności ich wstawiania.

#include <iostream>
#include <set>

int main() {
    std::set<int> s{50, 10, 40, 20, 30};
    for (int x : s) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

Usuwanie duplikatów

Przekazanie wartości do zbioru to szybki sposób na jednoczesne usunięcie duplikatów i posortowanie danych.

#include <iostream>
#include <set>
#include <vector>

int main() {
    std::vector<int> v{4, 2, 4, 1, 2, 3, 1};
    std::set<int> unique(v.begin(), v.end());
    for (int x : unique) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

lower_bound i upper_bound

Ponieważ zbiór jest uporządkowany, lower_bound() i upper_bound() pozwalają wydajnie znajdować zakresy.

#include <iostream>
#include <set>

int main() {
    std::set<int> s{10, 20, 30, 40, 50};
    auto lo = s.lower_bound(20);
    auto hi = s.upper_bound(40);
    for (auto it = lo; it != hi; ++it) std::cout << *it << ' ';
    std::cout << '\n';
    return 0;
}

Rozmiar i czyszczenie

size() zwraca liczbę elementów, empty() sprawdza, czy zbiór jest pusty, a clear() usuwa całą zawartość.

#include <iostream>
#include <set>

int main() {
    std::set<int> s{1, 2, 3};
    std::cout << s.size() << '\n';
    s.clear();
    std::cout << std::boolalpha << s.empty() << '\n';
    return 0;
}

Wstawianie zakresu

Można wstawić cały zakres z innego kontenera, automatycznie usuwając duplikaty i sortując elementy.

#include <iostream>
#include <set>

int main() {
    std::set<int> s{1, 2, 3};
    int more[] = {3, 4, 5};
    s.insert(more, more + 3);
    for (int x : s) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

Szybkie sprawdzenie

Proszę sprawdzić zrozumienie działania std::set.

Podsumowanie

Poznali Państwo, że std::set:

  • przechowuje wartości unikatowe i posortowane
  • po cichu ignoruje próby wstawienia duplikatów
  • obsługuje zapytania find, count, erase oraz uporządkowane lower_bound/upper_bound

Następnie poznają Państwo multimap i multiset, które umożliwiają przechowywanie duplikatów.

Bezpłatny start

Ucz się C++ dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
51
Lekcje
203

Często zadawane pytania

Czy lekcja „std::set” jest bezpłatna?

Tak — pełny tekst „std::set” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „std::set”?

Uporządkowane unikatowe elementy Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C++ Academy?

Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „std::set”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?

Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. std::map
  2. std::set
  3. multimap i multiset
  4. Niestandardowe komparatory
← Powrót do C++ Academy