🗺
Когда нам нужно хранить пары «Ключ - Значение», рука сама тянется написать
Но с точки зрения производительности
🌲 1.
Каждый элемент в
• Чтобы найти элемент, процессор прыгает по указателям:
• Каждый прыжок - это потенциальный Cache Miss (промах кэша). Процессор ждет сотни тактов, пока данные подтянутся из RAM.
• Сложность поиска: O(log N).
⚡ 2.
Здесь нет деревьев. Ключ превращается в число (хеш), и мы сразу прыгаем в нужную ячейку массива (Bucket).
• Массивы любят кэш процессора (Cache Locality).
• Сложность поиска: O(1) (в среднем). Это мгновенно.
🐢 Насколько велика разница?
На маленьких объемах (до 100 элементов) разницы почти нет.
Но на 1,000,000 элементов
🤔 Когда использовать
Только в одном случае: Вам жизненно важен порядок ключей.
Например, если вы хотите вывести пользователей по алфавиту или найти диапазон дат (
🚀 Бонус: C++23
В новом стандарте завезли
Это самый быстрый вариант для поиска, но медленный для вставки. Если у вас C++23 - присмотритесь!
💡 Итог: если вам не нужна сортировка, всегда пишите
#cpp #stl #optimization #performance #map #hashing #coding #tips
➡️ @cpp_geek
std::map или std::unordered_map: Битва за кэшКогда нам нужно хранить пары «Ключ - Значение», рука сама тянется написать
std::map. Это стандарт, это удобно, это сортировка из коробки.Но с точки зрения производительности
std::map это часто худший выбор. Почему?🌲 1.
std::map - Это Дерево (Red-Black Tree)Каждый элемент в
map - это отдельный узел (Node), выделенный в куче (new). Узлы разбросаны по памяти хаотично.• Чтобы найти элемент, процессор прыгает по указателям:
Root -> Left -> Right -> ...• Каждый прыжок - это потенциальный Cache Miss (промах кэша). Процессор ждет сотни тактов, пока данные подтянутся из RAM.
• Сложность поиска: O(log N).
⚡ 2.
std::unordered_map - Это Хеш-таблицаЗдесь нет деревьев. Ключ превращается в число (хеш), и мы сразу прыгаем в нужную ячейку массива (Bucket).
• Массивы любят кэш процессора (Cache Locality).
• Сложность поиска: O(1) (в среднем). Это мгновенно.
🐢 Насколько велика разница?
На маленьких объемах (до 100 элементов) разницы почти нет.
Но на 1,000,000 элементов
std::unordered_map может быть в 3-5 раз быстрее просто за счет отсутствия прыжков по памяти.🤔 Когда использовать
std::map?Только в одном случае: Вам жизненно важен порядок ключей.
Например, если вы хотите вывести пользователей по алфавиту или найти диапазон дат (
lower_bound / upper_bound).🚀 Бонус: C++23
std::flat_mapВ новом стандарте завезли
std::flat_map. Это гибрид: интерфейс как у map (сортированный), но внутри - сплошной вектор.Это самый быстрый вариант для поиска, но медленный для вставки. Если у вас C++23 - присмотритесь!
💡 Итог: если вам не нужна сортировка, всегда пишите
std::unordered_map. Не заставляйте процессор бегать по дереву указателей без причины.#cpp #stl #optimization #performance #map #hashing #coding #tips
➡️ @cpp_geek
👍11🔥5❤4