Я построил почти ту же гибридную структуру данных, что и вы (список / карта с той же алгоритмической сложностью, если бы вместо этого я использовал unordered_map), и использовал ее время от времени в течение почти десятилетия, хотя этовид громоздкой структуры (что-то, что я бы использовал для удобства, а не для эффективности).
Стоит отметить, что это сильно отличается от простого использования std::unordered_map
напрямую.Для начала он сохраняет исходный порядок, в котором вставляются элементы.Вставка, удаление и поиск гарантированно происходят в логарифмическом времени (или постоянном времени, в зависимости от того, включен ли поиск ключа и используется ли хеш-таблица или BST), итераторы не становятся недействительными при вставке / удалении (основное требование, которое мне было нужночто заставило меня отдать предпочтение std :: map вместо std :: unordered_map) и т. д.
То, как я это сделал, выглядело так:
// I use this as the iterator for my container with
// the list being the main 'focal point' while I
// treat the map as a secondary structure to accelerate
// key searches.
typedef typename std::list<Value>::iterator iterator;
// Values are stored in the list.
std::list<Value> data;
// Keys and iterators into the list are stored in a map.
std::map<Key, iterator> accelerator;
Если вы сделаете это так, оно станетдовольно легко.push_back - это возврат к списку и добавление последнего итератора на карту, удаление итератора - это удаление ключа, на который указывает итератор, с карты перед удалением элемента из списка в качестве итератора списка, поискключ - это вопрос поиска на карте и возврата связанного значения на карте, которое является итератором списка, удаление ключа - это просто поиск ключа, а затем удаление итератора и т. д.
Если вы хотите улучшитьвсе методы с постоянным временем, тогда вы можете использовать std :: unordered_map вместо std :: map, как я делал здесь (хотя это сопровождается некоторыми оговорками).
Использование такого подхода должно значительно упростить ситуациюнавязчивое решение на основе списков, где вам нужно вручную освободить память.