8
votes

Effacer le premier N articles d'un STD :: Carte?

Essayer d'écrire une méthode qui supprime les premiers éléments (clés les plus bas) N d'une carte STD :: Plan. Essayé ceci: xxx

Il fonctionne lorsque le nombre d'éléments est supérieur au nombre demandé à être supprimé. Donc, si j'avais cinq éléments, demande de supprimer 2, les 3 derniers éléments restent. Toutefois, si j'ai un élément et une demande d'effacement 2, je reste un élément restant.

Y a-t-il un moyen net de couvrir cela? Je pourrais pousser une instruction IF autour de la vérification du nombre de numélystoremove supérieur à map.Size () mais il doit y avoir une meilleure solution?


1 commentaires

Pourquoi y aurait-il une meilleure solution que la solution la plus simple?


4 Réponses :


4
votes

std :: avancée (i, n) a une condition préalable que i peut être incrémenté au moins n fois. Dans votre code, vous ne vérifiez pas cette condition préalable, donc si vous l'appelez avec numelementalemove> Originalsize , vous enfreignez cette condition préalable et subit ainsi un comportement non défini. Pour résoudre ce problème, vous devez faire le chèque avant d'appeler std :: avancement , peut-être utiliser std :: min : xxx


0 commentaires

4
votes

Un si instruction fournit une solution simple et lisible: xxx


0 commentaires

1
votes

La manière la plus simple que je puisse voir pour ce faire serait d'utiliser std :: Suivant code> et une instruction IF.

void EraseNMapElements(const int numElementsToRemove)
{
    if (_map.size() < numElementsToRemove)
        _map.erase(_map.begin(), std::next(_map.begin(), numElementsToRemove));
    else
        _map.clear();
}


0 commentaires

3
votes

Une chose qui n'a pas encore été mentionnée et c'est bon à savoir, c'est que depuis C ++ 11 std :: map :: Effacer (const_iterator) renvoie réellement un itérateur à l'élément suivant. Donc, le code pourrait également être écrit comme suit: xxx

Ceci traversera les éléments à effacer une fois au lieu de deux fois.


1 commentaires

Vrai. Dans le même temps, il est tout à fait possible que le multi-élément effacer pourrait être optimisé pour réduire considérablement le nombre d'opérations d'équilibrage nécessaires, comparativement à une effacement à une fois à la fois. Comme toujours: lorsque vous considérez la performance, mesurez-la.