2015-03-28 5 views
1

Les algorithmes et les fonctions membres sont suggérés en boucle pour plus d'efficacité lorsque vous travaillez avec des conteneurs. Cependant, les conteneurs associatifs (unordered_map) ne fonctionnent pas avec le paradigme erase (remove_if), il semble que la méthode commune consiste à se replier sur une boucle.Une manière non-loop efficace pour effacer de unordered_map avec le prédicat C++ 11?

UOM est un 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; 
    } 
} 

// comme par Scott Meyers efficace STL PG45

est ce aussi efficace que possible? Il semble qu'il devrait y avoir un meilleur moyen d'utiliser le paradigme erase (remove_if) mais cela fonctionne pour unordered_map (je comprends que les conteneurs associatifs ne peuvent pas être "réordonnés" d'où le non-support de l'algorithme remove_if) . Est-ce vraiment le meilleur moyen d'effacer des entrées d'unordered_map en utilisant un prédicat? Aucune suggestion?

Merci d'avance.

Répondre

0

C'est aussi efficace que possible. Si vous voulez quelque chose de plus pratique, vous pouvez utiliser le modèle erase_if de boost - voir here. unordered_map maintient une liste chaînée de nœuds dans chaque compartiment, il est donc bon de les effacer. Il n'y a pas besoin de remove-if type "compactage", qui convient std::vector de l'utilisation de la mémoire contiguë.