Tri des vecteurs en fonction d'un vecteur de référence externe
Dans les situations où plusieurs vecteurs de longueur égale sont présents, le tri d'un vecteur nécessite une solution qui transforme simultanément tous les autres vecteurs en conséquence.
Considérez ce qui suit scénario :
std::vector<int> Index = { 3, 1, 2 }; std::vector<std::string> Values = { "Third", "First", "Second" };
Transformation : L'index est trié.
Résultat attendu : Les valeurs doivent également être triées.
Une approche consiste à créer un vecteur contenant à la fois l'index d'origine et les éléments du tri-dictateur vecteur :
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);
Ensuite, ce vecteur est trié :
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());
L'ordre de tri permet le réarrangement d'autres vecteurs :
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; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!