Нецикличный эффективный способ удаления из 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
Использование непрерывной памяти.