std::set
Упорядоченные уникальные элементы
«std::set» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Что такое std::set?
std::set хранит уникальные элементы в отсортированном порядке. Дубликатов нет, а поиск выполняется за логарифмическое время.
- Ключи одновременно являются значениями.
- Подходит для проверки наличия и удаления дубликатов.
#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;
}Вставка значений
Используйте insert() для добавления элементов. Вставка уже существующего значения просто игнорируется.
#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;
}Возвращаемое значение insert
insert() возвращает объект pair, поле .second которого содержит bool и сообщает, произошла ли вставка.
#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;
}Проверка наличия
Используйте count() или contains() из 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;
}Поиск элементов
find() возвращает итератор на совпадающий элемент или end(), если элемент отсутствует.
#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;
}Удаление элементов
erase() удаляет значение по ключу и возвращает количество удалённых элементов (0 или 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;
}Отсортированный порядок
Элементы всегда перебираются в порядке возрастания, независимо от порядка их вставки.
#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;
}Удаление дубликатов
Передача значений в set — быстрый способ одновременно удалить дубликаты и отсортировать значения.
#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 и upper_bound
Поскольку set упорядочен, lower_bound() и upper_bound() позволяют эффективно находить диапазоны.
#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;
}Размер и очистка
size() сообщает количество элементов, empty() проверяет отсутствие элементов, а clear() удаляет всё.
#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;
}Вставка диапазона
Можно вставить целый диапазон из другого контейнера, автоматически удалив дубликаты и выполнив сортировку.
#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;
}Быстрая проверка
Проверьте, насколько хорошо Вы поняли поведение std::set.
Итоги
Вы узнали, что std::set:
- хранит уникальные отсортированные значения;
- молча игнорирует повторные вставки;
- поддерживает
find,count,eraseи упорядоченные запросы с помощьюlower_bound/upper_bound.
Далее Вы познакомитесь с multimap и multiset, которые допускают дубликаты.
Часто задаваемые вопросы
Урок «std::set» бесплатный?
Да — полный текст урока «std::set» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «std::set»?
Упорядоченные уникальные элементы Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «std::set»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.