В ответ на ваш отредактированный вопрос, никакие эти два фрагмента не эквивалентны вообще. std::map
хранит узлы в древовидной структуре, unordered_map
сохраняет их в хеш-таблице *.
Ключи хранятся не в порядке их «хэш-значения», поскольку они не сохраняются в в любом порядке . Вместо этого они хранятся в «контейнерах», где каждый сегмент соответствует диапазону значений хеш-функции. В основном, реализация выглядит так:
function add_value(object key, object value) {
int hash = key.getHash();
int bucket_index = hash % NUM_BUCKETS;
if (buckets[bucket_index] == null) {
buckets[bucket_index] = new linked_list();
}
buckets[bucket_index].add(new key_value(key, value));
}
function get_value(object key) {
int hash = key.getHash();
int bucket_index = hash % NUM_BUCKETS;
if (buckets[bucket_index] == null) {
return null;
}
foreach(key_value kv in buckets[bucket_index]) {
if (kv.key == key) {
return kv.value;
}
}
}
Очевидно, что это серьезное упрощение, и реальная реализация будет намного более продвинутой (например, поддержка изменения размера массива buckets
, возможно, использование древовидной структуры вместо связанного списка для сегментов и т. Д.), Но это должно дать идея о том, как вы не можете вернуть значения в любом конкретном порядке. См. wikipedia для получения дополнительной информации.
* Технически, внутренняя реализация std::map
и unordered_map
определяется реализацией, но стандарт требует определенной сложности Big-O для операций, которые подразумевают этих внутренних реализаций