Могу ли я отсортировать вектор, чтобы он соответствовал сортировке unordered_map? - PullRequest
0 голосов
/ 21 мая 2018

Могу ли я отсортировать vector так, чтобы он совпадал с сортировкой unordered_map?Я хочу перебрать unordered_map, и если бы я мог только перебрать каждый контейнер один раз, чтобы найти их пересечение, а не искать каждый ключ.

Так, например, дано unordered_map, содержащее:

1, 2, 3, 4, 5, 6, 7, 8, 9

, который хэшируется в этот порядок:

1, 3, 4, 2, 5, 7, 8, 6, 9

Я бы хотел, если бы получил vector из:

1, 2, 3, 4

Я мог бы как-то отогнать сортировку unordered_map для использования при сортировке vector, чтобы она сортировалась на:

1, 3, 4, 2

Есть ли способ сделать это?Я заметил, что unordered_map предоставляет hash_function, могу ли я использовать это?

1 Ответ

0 голосов
/ 21 мая 2018

Как правильно отмечают комментарии, на unordered_map нет даже удаленно переносимого способа сортировки соответствия.Таким образом, сортировка не определена.

Однако в стране неопределенных, иногда по разным причинам мы можем быть спокойны с тем, что делает наша реализация , даже если не указано и не переносимо.Итак, кто-то может взглянуть на вашу реализацию карты и использовать ее детерминизм в векторе?

Проблема с unordered_map в том, что это хеш.Каждый элемент, вставленный в него, будет хеширован, а хеш (сопоставленный с пространством ключа) будет использоваться как индекс во внутреннем массиве.Это выглядит многообещающе, и было бы многообещающе, если бы не столкновение.В случае столкновения клавиш элементы помещаются в список столкновений, и этот список вообще не сортируется.Таким образом, порядок итерации по столкновению будет определяться порядком вставок (обратный или прямой).Из-за этого, при отсутствии информации о порядке вставок, было бы невозможно имитировать порядок unordered_map, даже для конкретной реализации.

...