← Назад к вопросам
Какой контейнер лежит в основе map?
1.8 Middle🔥 251 комментариев
#STL контейнеры и алгоритмы#Структуры данных и алгоритмы
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Какой контейнер лежит в основе map?
map в C++ Standard Library строится на основе красно-чёрного дерева (Red-Black Tree). Это самобалансирующееся бинарное дерево поиска, которое обеспечивает эффективность операций благодаря поддержанию баланса.
Почему именно красно-чёрное дерево?
Красно-чёрное дерево выбрано потому, что оно гарантирует:
- O(log n) для поиска, вставки и удаления элементов
- Автоматическая балансировка при каждой модификации
- Предсказуемая производительность — нет деградации к O(n) как в несбалансированных деревьях
- Итераторы остаются валидными после операций (за исключением удаляемого элемента)
- Упорядоченный обход в отсортированном порядке ключей
Структура узла красно-чёрного дерева
struct Node {
Key key;
Value value;
Node* left;
Node* right;
Node* parent;
Color color; // RED или BLACK
};
Правила красно-чёрного дерева
- Каждый узел либо красный, либо чёрный
- Корень всегда чёрный
- Листья (NIL) чёрные
- Красный узел не может иметь красного потомка
- Все пути от узла до листьев содержат одинаковое количество чёрных узлов
Операции в map
#include <map>
#include <iostream>
int main() {
std::map<int, std::string> m;
// Вставка O(log n)
m[1] = "один";
m.insert({2, "два"});
// Поиск O(log n)
auto it = m.find(1);
// Удаление O(log n)
m.erase(1);
// Итерация в отсортированном порядке
for (const auto& [key, value] : m) {
std::cout << key << ": " << value << '\n';
}
return 0;
}
Альтернативы
- unordered_map — построена на хеш-таблице, O(1) в среднем, но без сортировки
- multimap — тоже красно-чёрное дерево, но допускает дублирующиеся ключи
- std::set — красно-чёрное дерево без значений, только ключи
Практический пример
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores["Charlie"] = 92;
// Автоматически отсортировано
for (const auto& [name, score] : scores) {
std::cout << name << ": " << score << '\n';
}
// Вывод: Alice, Bob, Charlie (в лексикографическом порядке)
Красно-чёрное дерево — это оптимальный выбор для упорядоченного доступа с быстрыми операциями модификации, что и является главной целью std::map.