2010-10-19 9 views
1

Je veux créer std :: map en STL, mais le comparateur dépend d'une valeur dynamique qui n'est disponible qu'au moment de l'exécution. Comment puis-je faire cela? Par exemple, je veux quelque chose ressemble à std::map<int, int, Comp(value1, value2)>. valeur1 et valeur2 ne sont pas le nombre comparé ici, ils sont une sorte de numéros de configuration.Puis-je créer une carte avec un comparateur dynamique dynamique?

Répondre

9

Utilisez un functor class:

#include <map> 

class Comp 
{ 
public: 
    Comp(int x, int y) : x(x), y(y) {} 
    bool operator() (int a, int b) const { /* Comparison logic goes here */ } 
private: 
    const int x, y; 
}; 

int main() 
{ 
    std::map<int,float,Comp> m(Comp(value1,value2)); 
} 

Cela ressemble à une fonction, mais sous la forme d'un objet d'exécution. Cela signifie qu'il peut avoir un état, ce qui inclut la configuration d'exécution. Tout ce que vous avez à faire est de surcharger operator(). Si vous définissez tous les corps de fonctions membres dans la définition de classe (comme ci-dessus), alors le compilateur va probablement tout mettre en ligne, donc il y aura un surcoût de performance négligeable.

Si vous connaissez value1 et value2 à la compilation (si elles sont constantes de compilation), vous pouvez utiliser un modèle de fonction à la place:

template <int x, int y> 
bool compare(int a, int b) { /* Comparison logic goes here */ } 

int main() 
{ 
    std::map<int,float,compare<value1,value2> > m; 
} 
+3

Le code est correct, mais vous n » t vraiment souligner _why_ un foncteur est la solution. Si vous instanciez la carte avec le funtor _type_, vous pouvez (au moment de l'exécution) passer un functor _object_ au constructeur de la carte. – MSalters

+0

@MSalters: Fair point. J'ai mis à jour ma réponse légèrement. –

Questions connexes