C++. Итерирование огромного std::multimap при обработке многих элементов в MIA

У меня есть ситуация, когда objects добавит события (структура, содержащая указатель на функцию, например object::do_something) в "цепочку событий" (std::multimap) в их конструкторе. Мой переводчик читает цепочку событий (отсортированных по глубине) каждый раз, когда игра обновляется, и выполняет каждое из них последовательно. Когда object уничтожен, он автоматически удалит все свои события из цепочки в своем деструкторе (чтобы предотвратить возможные утечки событий).

Поскольку события отсортированы по глубине, возможно, что объект может зарегистрировать несколько событий, которые находятся "рядом" друг с другом в цепочке. Когда объект уничтожает себя, он отменяет связь всех своих событий и немедленно прекращает выполнение своей доли кода (когда что-то уничтожается, он ничего не может сделать). Я хитро придумал способ сделать это; конкретная функция, которая удаляет объект, instance_destroy() выдаст исключение, которое мой интерпретатор событий может перехватить и продолжить вместе со следующим событием в цепочке.

Я пришел к пониманию;

  • Непредсказуемое количество событий можно отсоединить от цепочки, и текущий итератор (вероятно) будет признан недействительным, когда объект разрушает сам себя.
  • Объекты могут уничтожать другие объекты в течение своей жизни, а также самих себя. Я не могу просто сохранить копию следующего итератора, который не принадлежит текущему объекту в случае уничтожения, так как он также может быть удален!

Когда управление передается обратно интерпретатору (скажем, через исключение) и куча событий удаляется, включая, возможно, текущий итератор, я не могу знать, что выполнять дальше. Я не могу запустить карту с самого начала - это может привести к неопределенному поведению в игре; все будет выполнено дважды. Я также не могу скопировать карту - она ​​абсолютно ОГРОМНА - это приведет к огромным потерям производительности. Я не могу изменить дизайн системы, так как это не мой протокол.

Рассмотрим следующую структуру данных;

typedef std::multimap<real_t, event> events_by_depth_t;

Как я могу повторить это, учитывая мои требования выше?

Я использую C++11.

0 ответов

Другие вопросы по тегам