Хранятся ли объекты в std::unordered_map в порядке добавления?

«Хранятся ли объекты в std::unordered_map в порядке добавления?» — вопрос из категории STL, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет. std::unordered_map — это хэш-таблица, и порядок её элементов не гарантируется. Он зависит от хэш-функции, внутренней структуры бакетов (корзин) и может меняться при рехэшировании (например, при увеличении размера контейнера).

Пример:

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

int main() {
    std::unordered_map<int, std::string> map;

    // Вставка в порядке возрастания ключа
    map.insert({3, "three"});
    map.insert({1, "one"});
    map.insert({4, "four"});
    map.insert({2, "two"});

    std::cout << "Iteration order:n";
    for (const auto& [key, value] : map) {
        std::cout << key << ": " << value << 'n';
    }
    // Вывод может быть, например: 2: two, 4: four, 1: one, 3: three
    // Порядок не соответствует ни порядку добавления, ни сортировке по ключу.
}

Альтернативы, если порядок важен:

  1. std::map — хранит элементы, отсортированные по ключу (логарифмический доступ).
  2. std::vector<std::pair<Key, Value>> — сохраняет порядок вставки, но поиск линейный.
  3. Комбинация структур — например, std::unordered_map<Key, Value> для быстрого поиска + std::vector<Key> для сохранения порядка.