Question

Je travaille sur un système où je dois être capable de trier un vecteur par un prédicat, que mes cours ne devraient pas avoir le contrôle donné plus. En fait, je les passe une classe dérivée et ils aveuglément tri sur elle.

Comme l'un des « bizarreries » délicieux, l'un des motifs de tri est ordre d'entrée. Voici ce que j'ai à ce jour.

struct Strategy
{
   virtual bool operator()(const Loan& lhs, const Loan& rhs) const = 0;
};

struct strategyA : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return true;
   }
};

struct strategyB : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return lhs.getID() > rhs.getID();
   }
};

struct strategyC : public Strategy
{
   bool operator()(const Loan& lhs, const Loan& rhs) const
   {
      return lhs.getFee() > rhs.getFee();
   }
};

De toute évidence, comme strategyA est réfléchi, il ne peut pas être utilisé, et si je mets à faux, il va tout traiter comme égal et je peux embrasser mon adieu de données.

Alors, voici ma question. Est-il possible de définir une fonction sous-jacente pour le tri d'un vecteur qui ne changera rien?

Je suis conscient du fait que peut-être la solution la plus simple est d'ajouter un ordre de la variable d'entrée à la classe du prêt ou partenaire avec un dans une paire. Sinon je pourrais nourrir un paramètre avec le prédicat qui indique la trieuse si vous souhaitez utiliser ou non.

Était-ce utile?

La solution

Personnellement, je pense que votre classe de stratégie devrait avoir une méthode « de tri ». De cette façon, il peut soit appeler std :: sort ou non, comme il le juge opportun. Que et comment devient partie intégrante de la stratégie de tri.

La réponse de Darios est très bon, si vous pouvez l'utiliser.

Il est possible de faire le tri en fonction de la position de l'élément dans un vecteur, mais cela ne signifie pas les éléments ne se déplaceront pas (de nombreux algorithmes de tri sera essentiellement bousculade-then-recours à vos données), vous devez avoir une certaine fiable façon de déterminer où les articles étaient quand vous avez commencé.

Il est possible pour la comparaison de garder une cartographie de position actuelle à la position d'origine, mais beaucoup de travail. Idéalement a besoin de la logique à construire dans l'algorithme de tri - pas seulement la comparaison -. Et qui est essentiellement la façon dont fonctionne stable_sort

Un autre problème - selon le conteneur -. L'ordre de (disons) adresses article est pas toujours l'ordre des éléments

Autres conseils

  

Est-il possible de définir une fonction sous-jacente pour le tri d'un vecteur qui ne changera rien?

Cela dépend de l'algorithme. Si votre tri est une stable , l'ordre des éléments « égaux » ne sera pas être modifié (ce qui est indéfini pour les tris instables).

Pensez à utiliser std::stable_sort.

si elle est simplement un vecteur dont vous parlez, peut-être vous pouvez vous contenter de fournir une interface qui détermine si vous devez trier ou non. vecteurs ne sont pas un conteneur ordonné, donc vous devez les trier explicitement. Il suffit de ne les trie pas du tout.

Il n'y a pas de fonction de tri qui maintiendrait l'ordre des éléments basés uniquement sur les valeurs des éléments. Vous devez fournir plus d'informations à votre Strategy, si elle est possible.

Une autre approche pourrait être d'apporter la sémantique de vos données sur le conteneur. Pensez à utiliser boost :: multi_index pour différentes voies d'accès et de commande sur les mêmes données:

http://www.boost.org /doc/libs/1_42_0/libs/multi_index/doc/index.html

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