Je veux stocker un objet avec une fonction de comparaison personnalisée dans un std::map
C++, par exemple:C++ fonction de comparaison avec génération de clé paresseux
std::map<Part, Inventory, PartCmp>
Pour le comparateur, je voudrais trier les objets par une « clé "Cela pourrait être coûteux à calculer, alors j'ai pensé à une méthode d'évaluation paresseuse. L'exemple ci-dessous est un peu trivial, mais illustre le problème:
class Part {
public:
std::string item_id;
int color_id;
int condition;
std::string name;
std::string category;
std::string key();
private:
std::string key_;
}
std::string Part::key() {
// Only create key value if it hasn't been done before
if (key_.empty()) {
ostringstream keystream;
keystream << item_id << color_id << condition;
key_ = keystream.str();
}
return key_;
}
Cela signifie que mon comparateur ressemble à ceci:
struct PartCmp {
bool operator() (Part& p1, Part& p2) const {
return p1.key() < p2.key();
}
};
Ceci est différent de tous les autres par exemple que j'ai vu où p1
et p2
sont déclarés comme const
paramètres.
Cependant, dans ce cas p1
et p2
ne peut pas être déclarée comme const
depuis la méthode key()
modifier ses objets respectifs. Le code compile mais est-ce une mauvaise chose à faire?
Et faites la 'clé()' méthode 'const'. – juanchopanza
Oui - la génération paresseuse (suivie de la mise en cache) comme celle-ci est l'un des rares cas où 'mutable' a vraiment du sens. –
Parfait! Étant nouveau sur C++, je n'avais pas encore rencontré cette fonctionnalité. Fonctionne très bien. – jasonm76