0Pricing
C++ Academy · Урок

unordered_set

Уникальные элементы на основе хеширования

«unordered_set» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Что такое неупорядоченное множество

std::unordered_set хранит уникальные элементы в хеш-таблице. В среднем проверка наличия выполняется за константное время, но отсортированного порядка нет.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s{1, 2, 3, 2, 1};
    std::cout << s.size() << " unique values\n";
    return 0;
}

Множество и неупорядоченное множество

Как и в случае с отображениями:

  • set: отсортированное, сложность — O(log n).
  • unordered_set: неупорядоченное, средняя сложность — O(1).

Выбирайте неупорядоченное множество для максимально быстрой проверки наличия элементов.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<std::string> seen{"a", "b", "c"};
    std::cout << (seen.count("b") ? "yes" : "no") << '\n';
    return 0;
}

Вставка значений

insert() добавляет элемент, игнорируя его, если он уже присутствует, и возвращает пару, в которой .second показывает, был ли элемент добавлен.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s;
    auto a = s.insert(5);
    auto b = s.insert(5);
    std::cout << std::boolalpha << a.second << ' ' << b.second << '\n';
    return 0;
}

Быстрая проверка наличия

Проверка того, встречалось ли Вам значение, — классический вариант использования. count() возвращает 0 или 1.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<std::string> blocked{"spam", "junk"};
    std::cout << blocked.count("spam") << '\n';
    std::cout << blocked.count("ok") << '\n';
    return 0;
}

Удаление элементов

erase() удаляет значение и возвращает количество удалённых элементов (0 или 1).

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s{1, 2, 3};
    s.erase(2);
    std::cout << "count 2: " << s.count(2) << '\n';
    std::cout << "size: " << s.size() << '\n';
    return 0;
}

Обнаружение дубликатов

Можно обнаружить первый дубликат в потоке, выполняя вставку и проверяя возвращаемый булев результат.

#include <iostream>
#include <unordered_set>

int main() {
    int data[] = {3, 7, 1, 7, 9};
    std::unordered_set<int> seen;
    for (int x : data) {
        if (!seen.insert(x).second) {
            std::cout << "first duplicate: " << x << '\n';
            break;
        }
    }
    return 0;
}

Итерация

Итерация работает, но порядок не определён. Суммируйте или обрабатывайте элементы, не предполагая какой-либо определённой последовательности.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s{10, 20, 30};
    int total = 0;
    for (int x : s) total += x;
    std::cout << "sum = " << total << '\n';
    return 0;
}

Удаление дубликатов из диапазона

Создайте неупорядоченное множество из диапазона, чтобы быстро удалить дубликаты (порядок не сохраняется).

#include <iostream>
#include <unordered_set>
#include <vector>

int main() {
    std::vector<int> v{1, 2, 2, 3, 3, 3};
    std::unordered_set<int> u(v.begin(), v.end());
    std::cout << u.size() << " unique\n";
    return 0;
}

find и count

find() возвращает итератор на элемент, чтобы Вы могли использовать его дальше, а count() лишь сообщает о наличии элемента.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<std::string> s{"alpha", "beta"};
    auto it = s.find("beta");
    std::cout << (it != s.end() ? *it : "none") << '\n';
    return 0;
}

Очистка и проверка пустоты

clear() удаляет все элементы, а empty() проверяет, что элементов нет.

#include <iostream>
#include <unordered_set>

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

Пересечение множеств

Чтобы найти общие элементы, перебирайте одно множество и проверяйте наличие каждого элемента в другом.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> a{1, 2, 3, 4};
    std::unordered_set<int> b{3, 4, 5};
    for (int x : a) if (b.count(x)) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

Быстрая проверка

Проверьте, насколько хорошо Вы поняли неупорядоченное множество.

Повторение

Вы узнали, что std::unordered_set:

  • хранит уникальные элементы, обеспечивая среднюю сложность операций O(1)
  • не имеет гарантированного порядка
  • идеально подходит для быстрой проверки наличия элементов и обнаружения дубликатов

Далее Вы научитесь хешировать собственные типы.

Часто задаваемые вопросы

Урок «unordered_set» бесплатный?

Да — полный текст урока «unordered_set» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «unordered_set»?

Уникальные элементы на основе хеширования Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «unordered_set»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. std::unordered_map
  2. unordered_set
  3. Пользовательские хеш-функции
  4. Вопросы производительности
← Назад к C++ Academy