friol l'approche est bonne lorsqu'elle est couplée avec le vôtre. Tout d'abord, construire un vecteur comprenant les numéros 1...n, ainsi que les éléments du vecteur de dicter l'ordre de tri:
typedef vector<int>::const_iterator myiter;
vector<pair<size_t, myiter> > order(Index.size());
size_t n = 0;
for (myiter it = Index.begin(); it != Index.end(); ++it, ++n)
order[n] = make_pair(n, it);
Maintenant, vous pouvez trier ce tableau à l'aide d'une coutume trieur:
struct ordering {
bool operator ()(pair<size_t, myiter> const& a, pair<size_t, myiter> const& b) {
return *(a.second) < *(b.second);
}
};
sort(order.begin(), order.end(), ordering());
Maintenant que vous avez capturé l'ordre de réaménagement à l'intérieur d' order
(plus précisément, dans la première composante des articles). Vous pouvez maintenant utiliser cette commande pour trier vos autres vecteurs. Il y a probablement un très habile en place dans la variante d'exécution dans le même temps, mais jusqu'à ce que quelqu'un d'autre arrive, voici une variante qui n'est pas en place. Il utilise order
comme une look-up table pour le nouvel index de chaque élément.
template <typename T>
vector<T> sort_from_ref(
vector<T> const& in,
vector<pair<size_t, myiter> > const& reference
) {
vector<T> ret(in.size());
size_t const size = in.size();
for (size_t i = 0; i < size; ++i)
ret[i] = in[reference[i].first];
return ret;
}