Детерминизм со вставкой в ​​неупорядоченные контейнеры

Если я вставлю одинаковые (размер и значение) элементы в два неупорядоченных контейнера, будет ли обход контейнеров двумя итераторами всегда давать один и тот же элемент в одной и той же позиции?

Если да, то можно ли сделать (единственную!) хэш-функцию, чтобы сломать этот детерминизм?


person Nikos Athanasiou    schedule 28.07.2014    source источник
comment
Таких гарантий нет, так что можно предположить, что и не будет. Например, легко представить себе реализацию, в которой положение двух конфликтующих элементов будет определяться порядком вставки.   -  person juanchopanza    schedule 28.07.2014


Ответы (1)


Это зависит от: если вы вставляете одни и те же элементы в одном и том же порядке в два разных неупорядоченных контейнера, то порядок должен быть одинаковым для обоих контейнеров, даже если сам порядок не указан.

Рассуждение немного запутанное: все операции, такие как hash(k) и перераспределение, детерминированы. Однако в Стандарте нет фактической цитаты, но возможность сделать find() в O(1) после insert(), похоже, исключает любую рандомизированную или иным образом недетерминированную вставку.

Однако, если вы измените порядок вставки, то все ставки будут сняты, потому что внутренние перераспределения изменят порядок элементов:

23.2.5 Неупорядоченные ассоциативные контейнеры [unord.req]

9 Элементы неупорядоченного ассоциативного контейнера организованы в сегменты. Ключи с одинаковым хеш-кодом появляются в одном сегменте. Количество сегментов автоматически увеличивается по мере добавления элементов в неупорядоченный ассоциативный контейнер, так что среднее количество элементов на сегмент остается ниже установленного предела. Перефразирование делает недействительными итераторы, меняет порядок между элементами и изменяет, в каких сегментах появляются элементы, но не делает недействительными указатели или ссылки на элементы. Для unordered_multiset и unordered_multimap повторное хеширование сохраняет относительный порядок эквивалентных элементов.

person TemplateRex    schedule 28.07.2014