in c ++ voudrait trier un vecteur de vecteur ( Exemple: P> 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é.
perm = {3, 2, 0, 1}
3 Réponses :
Vous pouvez utiliser voici le test: p> std :: Trier code> 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:
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 code> sur un vecteur vous évitera beaucoup de temps en réduisant un certain nombre d'appels vers
New / Malloc Code>.
edit forte> meilleur que avant l'approche sans utiliser des vecteurs d'aide: ( source sur idéone ): p> 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));
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 A> Je pense beaucoup mieux que les Antonakos, car il n'y a pas d'objets assistant juste pour trier.
Je dirais que le meilleur moyen serait de créer un vecteur d'intens 0..n, puis de trier ce tableau avec une fonction de comparaison qui compare les éléments correspondants du vecteur que vous essayez de trouver la permutation triée de. Quelque chose comme: Ceci minimise la surcharge d'allocation, car nous ne créons aucun objet temporaire important que nous traitions, puis extrayez l'autorisation finale - le même vecteur qui est renvoyé est le Temp pour le tri. p> p>
J'aime votre approche, mais cela ne compilera pas. Vous devriez le corriger. Ici un peu de code corrigé, je ne compilera toujours pas, mais je n'ai pas le temps: Ideone.com/hm8SC < / a>
@PAWEL: Certaines versions de GCC sont buggy et n'aiment pas les déclarations de classe locales à l'intérieur des fonctions de modèle qui sont ensuite transmises à d'autres fonctions de modèle, donc je la divise pour éviter ce problème.
Ce code compile avec succès - bien que je note que le message a été modifié après votre commentaire.
@Deadmg: le code Orignal (après avoir fixé les fautes de frappe triviales - manquant ; code>) compilera avec GCC 4.5 -STD = C ++ 0x. Le code modifié ci-dessus sera également compilé avec GCC 4.4
En C ++ 0X, vous pouvez utiliser la fonction Lambda, à la place de l'objet Foncteur (cochez ma réponse modifiée). Le code est encore plus court et imo propre.