Question

J'ai un std :: multimap où key est une classe personnalisée. Quelque chose comme ça:

Class X {
public:
    std::string s;
    int x;
    operator <(const X& other) const { return s < other.s; }
};
std::multimap<X, int> mymap;

Maintenant, j'aimerais utiliser upper_bound et lower_bound pour itérer sur tous les éléments ayant la même valeur de " s " ;. Dois-je implémenter un autre opérateur pour X (par exemple: ==). Ou cela fonctionnera correctement comme cela?

De plus, que dois-je fournir comme argument pour upper_bound et lower_bound ? Je suppose que je devrais créer un objet factice avec la valeur souhaitée de & "; <;>";

Était-ce utile?

La solution

Puisque class X est la clé de la carte multiple, le paramètre upper_bound() / lower_bound() doit être de ce type. Si std::string présente une conversion implicite à partir de X::s (qui est le type de less<>), vous pouvez l'utiliser comme paramètre pour operator <() / <=>.

La comparaison par défaut pour la carte multiple est <=> qui appelle simplement <=>. Il s’agit donc du seul opérateur que vous devez posséder dans <=> pour que la carte fonctionne.

Autres conseils

il vous suffit de fournir un opérateur == et <.

upper_bound et lower_bound sont comme toute autre méthode find-type, vous avez donc besoin du même type d'objet pour la comparaison - dans votre cas, un objet "factice" avec la valeur requise de s.

modifier : les commentaires sont exacts: vous n'avez besoin que de l'opérateur < pour lower / upper_bound, et trouvez. Mais si vous souhaitez appeler d'autres méthodes sur votre conteneur, vous aurez également besoin de l'opérateur ==. Par exemple. si vous voulez trier () votre conteneur, vous aurez besoin de l'opérateur ==.

Les 2 surcharges dont vous avez besoin pour tous les conteneurs STL sont opérateur < et opérateur ==. Je trouve sa pratique exemplaire de les mettre en œuvre tous les deux.

Bien sûr, la question pourrait également être résolue plus complètement en implémentant un foncteur de comparaison dans la carte elle-même, sans compter sur les objets. C'est souvent un bon moyen d'implémenter différents moyens d'appeler find () sur la carte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top