Нецикличный эффективный способ удаления из unordered_map с предикатом C++11?

Для повышения эффективности работы с контейнерами предлагаются алгоритмы и функции-члены. Однако ассоциативные контейнеры (unordered_map) не работают с парадигмой стирания (remove_if), похоже, что общий метод заключается в том, чтобы вернуться к циклу.

Uom является std:: unordered_map

for(auto it = uom.begin() ; it!=uom.end(); ){
    if(it->second->toErase()) {
        delete it->second; // omit delete if using std::unique_ptr
        fpc.erase(it++);
    }else{
        ++it;
    }
}

// согласно Скотту Мейерсу Эффективный STL pg45

это максимально эффективно? Похоже, что должен быть лучший способ сделать это, используя что-то вроде парадигмы erase (remove_if), но это работает для unordered_map (я понимаю, что ассоциативные контейнеры не могут быть "переупорядочены", следовательно, не поддерживается алгоритм remove_if), Это действительно лучший способ удалить записи из unordered_map с помощью предиката? Какие-либо предложения?

Заранее спасибо.

1 ответ

Это максимально эффективно. Если вы хотите что-то более удобное, вы можете использовать буст erase_if Шаблон - см. здесь. unordered_map поддерживает связанный список узлов в каждом сегменте, поэтому их легко удалить. Там нет необходимости remove-if type "уплотнение", которое устраивает std::vectorИспользование непрерывной памяти.

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