Я хочу реализовать мультикарту, которая поддерживает порядок вставки записей и позволяет вставлять/заменять на месте, не влияя на порядок. LinkedListMultimap
Гуавы почти идеален, но не позволяет заменить тот тип, который я ищу. LinkedListMultimap
реализован в виде хеш-карты и нескольких связанных списков; это выглядит так:
________________
/ \
(A,1) -> (B,2) -> (A,3) -> (C,4) -> (B,5) -> (C,6) -> (A,7)
\________\_______/\________________/_________________/
\_______________________/
Внутри каждый узел имеет указатель на следующий узел в последовательности, а также на следующий узел с тем же ключом, а хэш-таблица поддерживает сопоставление ключей с первым узлом с этим ключом.
К сожалению, это не позволяет выполнять эффективную вставку или замену на месте. Например, чтобы заменить (C,4)
на (B,8)
, мне пришлось бы пройти сколь угодно длинный путь назад, чтобы найти (B,2)
, чтобы обновить его указатель «следующий из того же ключа».
Лучшая идея, которая у меня есть, — связать каждый элемент с порядковым номером и сохранить отсортированный набор для каждого ключа. Но чтобы вставить в середину последовательности, мне понадобились бы бесконечно делимые порядковые номера.
(Кстати, я реализую это на C++, но я просто ищу описание структуры данных, которая будет работать. Если есть уже существующая библиотека, которая будет работать, это было бы здорово, но даже boost::multi_index_container
не работает. кажется, не справляется с задачей.)