#cpp
Я реализую аналог std::unordered_multimap, делаю это на C.
Меня интересует, каким образом в std::unordered_multimap (да и вообще) реализуется
хранение пар с одинаковыми ключами? Я покопался в исходниках, но шаблоны, умноженные
на инопланетные идентификаторы, исключают даже малейший шанс понять того, что там происходит
внутри.
Проблемы такие:
1) Если хэширование происходит только по ключу, тогда пары с одинаковыми ключами
будут выстраиваться в цепочки, длина которых не зависит от количества ячеек таблицы.
И это очень плохо.
2) Если хэширование происходит и по ключу, и по значению, тогда значения пар, уже
находящихся в таблице, нельзя будет изменять прямо на месте. Сперва их нужно будет
вырезать, затем изменять и потом вновь вставлять.
Подскажите, как в хэш-мультиотображениях принято решать описанную проблему.
Ответы
Ответ 1
Хеширование, разумеется, производятся только по ключу. И да, в традиционной реализации, пары с одинаковыми ключами будут выстраиваться в цепочку в одном bucket хэш-таблицы. Средства итерирования по std::unordered_multimap гарантируют, что пары с одинаковым ключом будут идти непрерывной последовательностью в процессе итерирования. Поэтому как ни верти, разумная реализация будет вынуждена хранить их рядом. Ни о каком хэшировании "и по ключу, и по значению" в std::unordered_multimap не может быть и речи.
Комментариев нет:
Отправить комментарий