Итерация изменяющегося контейнера

Я повторяю набор функций обратного вызова. Функции вызываются во время итерации и могут привести к радикальным изменениям в фактическом контейнере набора функций.

Сейчас я делаю следующее:

  1. создаю копию исходного набора
  2. повторяю копию, но для каждого элемента проверяю, существует ли он еще в исходном наборе

Проверка существования каждого элемента супер- динамичный, но тоже кажется довольно медленным.

Есть ли другие предложения по решению этого дела?

Изменить: вот фактический код:

    // => i = event id
    template <class Param>
    void dispatchEvent(int i, Param param) {

        EventReceiverSet processingNow;

        const EventReceiverSet& eventReceiverSet = eventReceiverSets[i];
        std::copy(eventReceiverSet.begin(), eventReceiverSet.end(), std::inserter(processingNow, processingNow.begin()));

        while (!processingNow.empty()) {
            EventReceiverSet::iterator it = processingNow.begin();
            IFunction<>* function = it->getIFunction(); /// get function before removing iterator
            processingNow.erase(it);

            // is EventReceiver still valid? (may have been removed from original set)
            if (eventReceiverSet.find(ERWrapper(function)) == eventReceiverSet.end()) continue; // not found

            function->call(param);
        }
    };
9
задан Bill Kotsias 6 February 2012 в 20:07
поделиться