Назад к вопросам
Junior
124
questionbank
В чем заключается разница между контейнерами map и unordered_map в C++?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Главное различие в том, как элементы хранятся и извлекаются:
std::map: Хранит элементы в отсортированном порядке ключей. Обычно реализуется на основе красно-черного дерева. Поиск, вставка и удаление имеют логарифмическую сложность O(log N), где N — количество элементов.std::unordered_map: Хранит элементы в хэш-таблице. Порядок элементов произвольный. В среднем, поиск, вставка и удаление имеют константную сложность O(1). В худшем случае, при наличии коллизий, сложность может достигать O(N).
| Признак | std::map |
std::unordered_map |
|---|---|---|
| Упорядоченность | По ключу (возрастание) | Нет |
| Базовая структура | Красно-черное дерево | Хэш-таблица |
| Средняя сложность | O(log N) | O(1) |
| Худшая сложность | O(log N) | O(N) |
| Требования к ключу | Оператор < |
Хеш-функция и == |
Пример использования:
#include <map>
#include <unordered_map>
#include <string>
#include <iostream>
int main() {
// std::map: элементы упорядочены по ключу
std::map<std::string, int> sorted_map;
sorted_map["banana"] = 3;
sorted_map["apple"] = 1;
sorted_map["cherry"] = 2;
// Вывод: apple 1, banana 3, cherry 2 (порядок важен)
for (const auto& pair : sorted_map) {
std::cout << pair.first << " " << pair.second << std::endl;
}
std::cout << "---" << std::endl;
// std::unordered_map: порядок элементов не гарантирован
std::unordered_map<std::string, int> unordered_map;
unordered_map["banana"] = 3;
unordered_map["apple"] = 1;
unordered_map["cherry"] = 2;
// Вывод может быть разным (например, cherry 2, apple 1, banana 3)
for (const auto& pair : unordered_map) {
std::cout << pair.first << " " << pair.second << std::endl;
}
return 0;
}