2012-07-22 4 views
1

Si je donne les résultats suivants:Sélection maximum « n » valeurs

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <iterator> 

    struct Features{ int F1, F2, F3, F4; }; 

    int criterionFunction(Features const& features) { 
     return 
      -2*features.F1*features.F2 
      +3*features.F1 
      +5*features.F2 
      -2*features.F1*features.F2*features.F3 
      +7*features.F3 
      +4*features.F4 
      -2*features.F1*features.F2*features.F3*features.F4; } 

Comment puis-je appliquer transform() pour trouver la première TROISvaleurs max?

Merci.

+1

Pourquoi 'transformer'? 'nth_element' ou' partial_sort' semble plus approprié. – Philipp

+1

Veuillez être plus précis. Cela peut être un problème d'optimisation linéaire, ou peut-être vous voulez juste sélectionner quelques éléments d'une liste existante. – Philipp

Répondre

1

Vous ne pouvez pas. Ce n'est pas ce que fait std::transform.

transform applique une seule fonction à chaque élément de la séquence. Il ne sélectionne pas d'éléments spécifiques.

1

Avec une combinaison de std::transform, std::multiset, et un itérateur d'insertion que vous pourriez.

vector<Features> v; 
...fill it up 
multiset<int> ms; 
transform(v.begin(), v.end(), inserter(ms, ms.begin()), criterionFunction); 

Ensuite, les trois valeurs max sont les trois derniers éléments.

2

Voici un exemple d'utilisation nth_element avec un objet caractéristique plus simple et la fonction de critère (pour réduire l'encombrement):

#include <algorithm> 
#include <vector> 
#include <iterator> 
#include <iostream> 

typedef int Features; 

int criterionFunction(Features features) { 
    return features; 
} 

int main() { 
    std::vector<Features> v { 0, 4, 2, 5, 4, 3, -2, 1 }; 
    std::nth_element(v.begin(), v.begin() + 3, v.end(), 
        [](Features a, Features b) { 
         return criterionFunction(a) > criterionFunction(b); 
        }); 
    std::copy(v.begin(), v.begin() + 3, 
      std::ostream_iterator<Features>(std::cout, " ")); 
} 

Pour votre objet Features d'origine, il peut être utile de cache/memoize les résultats de l'criterionFunction pour éviter les appels en double. Notez que nth_element ne pas trier les éléments dans les deux partitions; Si vous souhaitez trier les trois premiers éléments, utilisez partial_sort à la place.

+0

Veuillez noter que 'nth_element' ne contient pas _not_ dans les 3 éléments _in order_. Le tri partiel ferait cela. – sehe

+0

@sehe L'OP n'a pas demandé qu'ils soient commandés :) J'ajoute cependant une remarque. – Philipp

Questions connexes