Maison >développement back-end >C++ >Comment trier plusieurs vecteurs simultanément en fonction d'un vecteur de référence ?

Comment trier plusieurs vecteurs simultanément en fonction d'un vecteur de référence ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-03 18:16:43273parcourir

How to Sort Multiple Vectors Simultaneously Based on a Reference Vector?

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&amp; a, pair<size_t, myiter> const&amp; 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn