6
votes

Tri un vecteur de (double précision) réels et obtenir leur

in c ++ voudrait trier un vecteur de vecteur ( 2 ^ 20 code>) de réelles, évidemment trier () code> fait le tour. Ayant utilisé R avant d'être utilisé dans la fonction Nice Commander () Code> Fonction qui donne la permutation qui mène au vecteur trié.

Exemple: P>

perm = {3, 2, 0, 1}


0 commentaires

3 Réponses :


4
votes

Vous pouvez utiliser std :: Trier Pour trier la liste des paires {(24, 0), (55, 2), (22, 0), (1, 1)}. Ce n'est pas particulièrement jolie, mais je fais habituellement quelque chose comme ceci: xxx

voici le test: xxx


1 commentaires

Bien joué. En outre, en faisant un modèle pour pouvoir trier non seulement les doubles seront excellents. Et, bien sûr, appeler une réserve sur un vecteur vous évitera beaucoup de temps en réduisant un certain nombre d'appels vers New / Malloc .



3
votes

edit forte>

meilleur que avant l'approche sans utiliser des vecteurs d'aide: ( source sur idéone ): p> xxx pré>

J'utilise lambda à partir de C ++ 0x, mais il peut être remplacé par un objet fonctionnaire simple: P>

template<class T>
struct CmpPairs{
  CmpPairs(const std::vector<T> &v): v_(v) {}
  std::vector<T> v_;
  bool operator()(int a, int b){ return v_[a] < v_[b]; }
};

template<class T>
CmpPairs<T> CreateCmpPairs(const std::vector<T> & v) { return CmpPairs<T>(v); }
//in sortingPermutation:
std::sort(v.begin(), v.end(), CreateCmpPairs(values));


2 commentaires

La règle du pouce que j'ai vue est que le tri d'un vecteur est plus efficace que d'utiliser un conteneur de tri automatique. Jamais testé cela pour voir à quel point c'est vrai.


Encore meilleur avec l'utilisation de C ++ 0x (Lambda pourrait être remplacé par le fonctionnement): Ideone.com/wryv Je pense beaucoup mieux que les Antonakos, car il n'y a pas d'objets assistant juste pour trier.