Maison >développement back-end >C++ >Comment trier un « std :: vector » en fonction de l'ordre d'un autre ?

Comment trier un « std :: vector » en fonction de l'ordre d'un autre ?

DDD
DDDoriginal
2024-12-07 12:16:13731parcourir

How to Sort One `std::vector` Based on the Order of Another?

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

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