std::set
Uporządkowane unikatowe elementy
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,eraseoraz uporządkowanelower_bound/upper_bound
Następnie poznają Państwo multimap i multiset, które umożliwiają przechowywanie duplikatów.
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.