Назад к вопросам
Junior
112
questionbank

В чем разница между std::map и std::unordered_map в C++?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

std::map:

  • Хранит элементы в отсортированном порядке по ключам.
  • Реализована на основе красно-черного дерева.
  • Время доступа, вставки и удаления в среднем логарифмическое: O(log n).
  • Ключи должны иметь оператор <.
  • Подходит, когда важен упорядоченный обход элементов или частые операции поиска диапазона.

std::unordered_map:

  • Не хранит элементы в каком-либо определенном порядке.
  • Реализована на основе хэш-таблицы.
  • Среднее время доступа, вставки и удаления: O(1). В худшем случае (при плохом хэшировании и большом количестве коллизий): O(n).
  • Ключи должны быть хэшируемыми (предоставлять хэш-функцию) и иметь оператор ==.
  • Подходит, когда главный приоритет — быстрое присутствие (lookup) элементов по ключу и порядок неважен.

Сравнительная таблица:

Признак std::map std::unordered_map
Порядок Сортированный Неупорядоченный
Структура данных Красно-черное дерево Хэш-таблица
Средняя сложность O(log n) O(1)
Требования к ключу Оператор < Хэшируемость, ==
Использование Упорядоченный доступ, диапазоны Быстрый поиск по ключу

Пример использования std::map:

#include <map>
#include <string>
#include <iostream>

// Пример использования std::map
std::map<int, std::string> my_map;
my_map[5] = "five";
my_map[2] = "two";
my_map[8] = "eight";

// Элементы будут выведены в отсортированном порядке по ключу
for (const auto& pair : my_map) {
    std::cout << pair.first << ": " << pair.second << std::endl;
}

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

#include <unordered_map>
#include <string>
#include <iostream>

// Пример использования std::unordered_map
std::unordered_map<int, std::string> my_unordered_map;
my_unordered_map[5] = "five";
my_unordered_map[2] = "two";
my_unordered_map[8] = "eight";

// Порядок вывода элементов не гарантируется
for (const auto& pair : my_unordered_map) {
    std::cout << pair.first << ": " << pair.second << std::endl;
}