2010-01-15 13 views
1

Je suis sur le point de refactoriser du code dupliqué. Deux fonctions effectuent une recherche dans un multimap en utilisant equal_range(). Dans une boucle for après l'appel à equal_range(), il y a une boucle for qui définit un itérateur à equalRange.first avec la condition it! = EqualRange.second.Retour d'une recherche multimap avec equal_range sans risque d'erreur

Si la valeur correcte est trouvée, les deux fonctions diffèrent. Ce que je voudrais faire est pour avoir la fonction de recherche comme une fonction d'aide propre utilisée par les précédemment mentionné deux.

Faire ce travail n'est pas le problème. Quel est le problème est que je ne peux pas trouver un moyen pour le rendre "facile" et à l'épreuve du futur d'une manière qui a du sens pour les autres personnes utilisant ce code. Évidemment, j'aimerais que quelque chose revienne de la fonction de recherche.

Si je devais renvoyer un booléen pour indiquer si la valeur a été trouvée dans le multimap, je devrais passer un itérateur au multimap qui pointe l'élément. Je trouve cela assez moche.

Si un itérateur a été retourné à la place, nous devons bien sûr vérifier cela par rapport aux limites dans les deux fonctions qui utilisent la fonction de recherche. Nous ne pouvons pas le vérifier contre multimap.end() puisque nous utilisons equal_range donc equalRange.second n'a pas à égal à multimap.end().

limite à l'aide de vérification returnIter == checkBound (x) où checkBound (x) retourne multimap :: upperbound (x) rend le checkBound (x) au courant de la mise en œuvre de equal_range de la fonction de recherche. Par conséquent, si quelqu'un d'autre devait changer la fonction de recherche, le checkBound (x) pourrait ne pas fonctionner comme prévu. Mon point ici est que les utilisateurs de la fonction de recherche ne devraient pas se préoccuper de la façon dont elle est implémentée, c'est-à-dire ne devraient pas savoir qu'elle utilise equal_range.

Quelles sont vos suggestions et suggestions? Suis-je sur-détaillé ici? Comment auriez-vous implémenté la fonction de recherche?

Merci

Répondre

1

au lieu d'un ou l'autre/ou une décision sur la valeur de retour, il me semble que vous voulez faire ce qui fonctionne comme map::insert ne - renvoient un std::pair<iterator, bool> pour signaler la position et le succès/échec de la fonction de recherche.

+0

N'a pas pensé à ça. À votre santé! – Tomas