← Назад ко всем вопросам

Какой контейнер лежит в основе unordered_map

1️⃣ Как кратко ответить

В основе unordered_map лежит хеш-таблица, которая обеспечивает амортизированное постоянное время для операций вставки, удаления и поиска.

2️⃣ Подробное объяснение темы

unordered_map — это контейнер из стандартной библиотеки C++, который реализует ассоциативный массив, где элементы хранятся в виде пар "ключ-значение". Основной особенностью unordered_map является то, что он не сохраняет порядок элементов, а обеспечивает быстрый доступ к данным благодаря использованию хеш-таблицы.

Хеш-таблица

Хеш-таблица — это структура данных, которая позволяет эффективно хранить и извлекать данные. Она использует хеш-функцию для преобразования ключа в индекс, по которому данные будут храниться в массиве. Это позволяет выполнять операции поиска, вставки и удаления за амортизированное постоянное время, что делает хеш-таблицы очень эффективными для работы с большими объемами данных.

Как это работает

  1. Хеш-функция: При добавлении элемента в unordered_map, ключ элемента передается через хеш-функцию, которая вычисляет индекс в массиве, где будет храниться элемент. Хеш-функция должна быть быстрой и равномерно распределять ключи по возможным индексам, чтобы минимизировать количество коллизий.

  2. Коллизии: Коллизия возникает, когда два разных ключа имеют одинаковый хеш-индекс. Для разрешения коллизий в unordered_map обычно используется метод цепочек, где элементы с одинаковым хеш-индексом хранятся в связном списке.

  3. Резервирование и перераспределение: Хеш-таблица имеет определенный размер, и по мере добавления элементов может потребоваться перераспределение, чтобы сохранить эффективность операций. Это происходит путем увеличения размера таблицы и перераспределения всех существующих элементов.

Пример использования unordered_map

#include <iostream>
#include <unordered_map>
#include <string>
​
int main() {
    // Создаем unordered_map для хранения пар "ключ-значение", где ключ — это строка, а значение — целое число
    std::unordered_map<std::string, int> umap;
​
    // Вставляем элементы в unordered_map
    umap["apple"] = 1;
    umap["banana"] = 2;
    umap["orange"] = 3;
​
    // Поиск элемента по ключу
    std::string key = "banana";
    if (umap.find(key) != umap.end()) {
        // Если ключ найден, выводим его значение
        std::cout << "Value for " << key << ": " << umap[key] << std::endl;
    } else {
        // Если ключ не найден, выводим сообщение
        std::cout << key << " not found in unordered_map." << std::endl;
    }
​
    return 0;
}
  • #include <unordered_map>: Подключение заголовочного файла для использования unordered_map.
  • std::unordered_map<std::string, int> umap;: Создание объекта unordered_map, где ключи — строки, а значения — целые числа.
  • umap["apple"] = 1;: Вставка элемента с ключом "apple" и значением 1.
  • umap.find(key): Поиск элемента по ключу. Возвращает итератор на элемент или end(), если элемент не найден.
  • umap[key]: Доступ к значению по ключу. Если ключ не найден, создается новый элемент с этим ключом и значением по умолчанию.

unordered_map широко используется в задачах, где требуется быстрый доступ к данным по ключу, например, в кэшах, индексах и других структурах, где порядок элементов не имеет значения.

Тема: STL: Контейнеры
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки