Maison >développement back-end >C++ >Comment trier un « std :: vector » en fonction de l'ordre d'un autre ?
Tri d'un std::vecteur par valeurs d'un std::vecteur différent
Ce problème implique d'aligner l'ordre d'un vecteur avec le ordre d’un autre vecteur. Par exemple, le vecteur Index contient des nombres [3, 1, 2] et le vecteur Valeurs contient des chaînes « Troisième, Premier, Deuxième ». Le tri de l'index par ordre croissant ([1, 2, 3]) devrait entraîner le tri des valeurs dans l'ordre correspondant (["Premier", "Deuxième", "Troisième"]).
Solution :
Une approche courante consiste à créer un ordre vectoriel en combinant les indices de l'index et leurs éléments correspondants des valeurs. Ce vecteur peut ensuite être trié à l'aide d'un comparateur personnalisé qui compare les éléments de l'index :
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); 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());
Le vecteur d'ordre résultant contient désormais les indices triés. Pour appliquer cet ordre aux valeurs, la fonction suivante peut être utilisée :
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; } Values = sort_from_ref(Values, order);
Cette fonction prend le vecteur d'origine in et le vecteur de référence contenant les indices triés et renvoie une copie de in triée en conséquence.
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!