Heim > Backend-Entwicklung > C++ > Wie sortiere ich einen „std::vector' basierend auf der Reihenfolge eines anderen?

Wie sortiere ich einen „std::vector' basierend auf der Reihenfolge eines anderen?

DDD
Freigeben: 2024-12-07 12:16:13
Original
717 Leute haben es durchsucht

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

Sortieren eines std::vector nach Werten eines anderen std::vector

Bei diesem Problem geht es darum, die Reihenfolge eines Vektors an der anzupassen Ordnung eines anderen Vektors. Beispielsweise enthält der Vektor „Index“ die Zahlen [3, 1, 2] und der Vektor „Werte“ die Zeichenfolgen „Third, First, Second“. Das Sortieren des Index in aufsteigender Reihenfolge ([1, 2, 3]) sollte dazu führen, dass die Werte in der entsprechenden Reihenfolge sortiert werden ([„Erster“, „Zweiter“, „Dritter“]).

Lösung :

Ein gängiger Ansatz besteht darin, eine Vektorordnung zu erstellen, indem Indizes aus Index und die entsprechenden Elemente aus Values ​​kombiniert werden. Dieser Vektor kann dann mit einem benutzerdefinierten Komparator sortiert werden, der die Elemente im Index vergleicht:

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());
Nach dem Login kopieren

Der resultierende Ordnungsvektor enthält nun die sortierten Indizes. Um diese Reihenfolge auf Werte anzuwenden, kann die folgende Funktion verwendet werden:

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);
Nach dem Login kopieren

Diese Funktion nimmt den Originalvektor in und den Referenzvektor, der die sortierten Indizes enthält, und gibt eine entsprechend sortierte Kopie von in zurück.

Das obige ist der detaillierte Inhalt vonWie sortiere ich einen „std::vector' basierend auf der Reihenfolge eines anderen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage