0Pricing
C++ Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. std::map
  2. std::set
  3. multimap и multiset
  4. Пользовательские компараторы
← Назад к C++ Academy