Pergunta

Estou trabalhando em um sistema em que preciso classificar um vetor por um determinado predicado, sobre o qual minhas classes não devem ter controle. Basicamente, passo a eles uma classe derivada e eles classificam cegamente nela.

Como uma das "peculiaridades deliciosas", um dos padrões de classificação é a ordem de entrada. Aqui está o que eu tenho até agora.

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();
   }
};

Obviamente, como a estratégia é reflexiva, não pode ser usada e, se eu o definir como False, tratará tudo como igual e eu posso beijar meus dados.

Então aqui está minha pergunta. Existe uma maneira de definir uma função de predicado para classificar um vetor que não mudará nada?

Estou ciente de que possivelmente a solução mais simples é adicionar uma variável de entrada de entrada à classe de empréstimo ou fazer parceria com uma em um par. Como alternativa, eu poderia alimentar um parâmetro com o predicado que informa ao classificador se deve usá -lo ou não.

Foi útil?

Solução

Pessoalmente, acho que sua aula de estratégia deve ter um método de "classificação". Dessa forma, ele pode ligar para o std :: classificar ou não, como considera o ajuste. Se bem como como se torna parte da estratégia de classificação.

Darios stable_sort A resposta é muito boa, se você pode usá -la.

É possível fazer classificação com base na posição do item em um vetor, mas isso não significa que os itens não se movam (muitos algoritmos de classificação basicamente lutam-depois reortam seus dados), portanto, você precisa ter uma maneira confiável de determinar onde estavam os itens quando você começou.

É possível a comparação manter um mapeamento da posição atual à posição original, mas muito trabalho. Idealmente, a lógica precisa ser incorporada no algoritmo de classificação - não apenas na comparação - e é essencialmente como funciona o estábulo.

Outro problema - dependendo do contêiner - a ordem dos endereços (digamos) nem sempre a ordem dos itens.

Outras dicas

Existe uma maneira de definir uma função de predicado para classificar um vetor que não mudará nada?

Depende do algoritmo. Se o seu tipo é um tipo estável, a ordem de elementos "iguais" não será alterada (que é indefinida para tipos instáveis).

Considere usar std::stable_sort.

Se for simplesmente um vetor de que você está falando, talvez você possa fornecer uma interface que determina se você deve classificar ou não. Os vetores não são um contêiner ordenado, então você precisa classificá -los explicitamente. Só não os classifique.

Não existe uma função de classificação que manteria a ordem dos itens com base apenas nos valores dos itens. Você precisa fornecer mais informações para o seu Strategy, Se for possível.

Uma abordagem diferente pode ser trazer a semântica de seus dados para o contêiner. Considere usar o boost :: multi_index para diferentes maneiras de acesso e pedidos nos mesmos dados:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top