Я много размышляю здесь ... Но ...
Я предполагаю, что вам нужно уметь делать разные вещи с этими двумя списками.Звучит так, будто вы пишете какой-то распределитель пула.
«Свободный список», как я ожидаю, просто должен позволять вам нажимать и выдвигаться вперед;это стек fifo, который можно использовать для хранения объектов, которые в данный момент не используются, но которые можно использовать, когда требуется выделение, а «свободный список» в настоящее время не пуст.
«Активный список»список всех выделенных в данный момент объектов.Распределителю может потребоваться иметь возможность сообщать об этом, или делать что-то с ними, или что-то еще.«Активный список» требует, чтобы вы могли удалить объект из любого места, когда объект становится освобожденным.Я предполагаю, что затем он помещается в свободный список для повторного использования.
Теперь структуры данных, которые можно использовать для каждого «списка», могут отличаться.Все зависит от точных требований.Я бы сказал, что вы должны иметь возможность использовать std::list<A *>
для своего «свободного списка», если я прав в требуемой семантике использования.Если вас не волнует возможность пройти «активный список» в порядке распределения, тогда вы можете использовать std::set<A *>
для своего «активного списка».Чтобы избежать необходимости выполнять поиск в наборе для удаления объекта из «активного списка», вы можете сохранить итератор в местоположении объекта в наборе в объекте (этот итератор не станет недействительным, если сам объект не будет удален иззадавать - или так сказать этот ответ , и я не проверял это, но я уверен, что кто-то исправит меня, если я ошибаюсь).Если вам НЕОБХОДИМО иметь возможность обходить «активный список» в порядке распределения, тогда вы можете использовать std::map<size_t, A *>
и сохранить в качестве ключа карты увеличивающийся индекс распределения;снова трюк «объект содержит итератор для быстрого стирания» должен работать.