Нормальное поведение контейнера C ++ (подкрепленное вашей подсказкой о размере объекта) заключается в сохранении каждого ключа и значения (какие понятия различаются только в неинъективном случае) только один раз, На отдельных этапах вставки и поиска предлагается непрерывное хранилище (для локальности кэша, если ничего больше). «Время за счет пространства» говорит, что вы хотите хеш-таблицу .
Сохраните массив pair<T1,T2>
и пару хэш-таблиц с низким коэффициентом загрузки *1013* с открытым адресом, отображающих ключи и значения (соответственно) в индексы в массиве. Каждый из них представляет собой не что иное, как массив индексов (или указателей, вычисленных после выделения (полного) массива) и имеет приличную производительность кэша.
Неинъективный случай
Сортировка (или, по крайней мере, группировка) пар по (не уникальному) значению T2
и сохранение в хеш-таблице (для каждого такого уникального значения) индекса начала запустить. Затем все соответствующие объекты T1
могут быть найдены вместе (останавливаясь на первом отличающемся T2
или в конце массива).
Если существует много T2
объектов, которые ==
и они взаимозаменяемы , вы можете вместо этого хранить отдельные массивы pair<T1,index>
и pair<T2,index>
, каждый из которых хранит индексы в другом, как указано выше. , Каждая запись в обеих хеш-таблицах затем сохраняет индексы в массиве T1
, поскольку любой ключ всегда необходим для проверки на равенство после поиска по хешу, и объект T2
в паре сразу и однозначно доступен из индекса, хранящегося рядом с T1
.