2013-01-17 3 views
0

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?

Répondre

5

Vous pouvez déclarer le champ

private: 
    mutable std::string key_; 

Voir this question.

Et aussi, comme l'a suggéré un commentaire de juanchopanza, faites votre méthode key()const

Enfin, je crois que vous faites plus certains memoization, pas une lazy evaluation.

+3

Et faites la 'clé()' méthode 'const'. – juanchopanza

+0

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. –

+0

Parfait! Étant nouveau sur C++, je n'avais pas encore rencontré cette fonctionnalité. Fonctionne très bien. – jasonm76

Questions connexes