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& a, pair<size_t, myiter> const& b) { return *(a.second) < *(b.second); } }; sort(order.begin(), order.end(), ordering());
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& 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);
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!