Heim >Backend-Entwicklung >C++ >Wie kann ich mehrere Vektoren in C gleichzeitig sortieren, ohne sie zu kopieren, Boost oder STL zu verwenden?
Zip-Container in C mit Boost oder STL sortieren
Einführung
Diese Frage untersucht die Herausforderung, mehrere Vektoren oder Container zusammen zu sortieren und dabei ihre Elementkorrespondenz beizubehalten, ohne sie zu kopieren. Ziel ist es, dies zu erreichen, ohne auf Tupel oder andere temporäre Datenstrukturen angewiesen zu sein.
Ursprüngliche Frage
Die ursprüngliche Frage stellt eine bestimmte Aufgabe: drei Vektoren zu sortieren und gleichzeitig sicherzustellen dass die Elemente in jedem Vektor in derselben Reihenfolge neu angeordnet werden. Das Kopieren der Vektoren in ein Tupel oder die Implementierung einer benutzerdefinierten Sortierfunktion wird ausdrücklich ausgeschlossen. Versuche, boost::zip_iterator oder boost::zip_range zu verwenden, waren aufgrund der schreibgeschützten und nicht wahlfreien Zugriffsart der Iteratoren erfolglos.
Antwort
A Eine funktionierende Lösung wurde von interjay bereitgestellt und nutzte tupleit.hh Bibliothek:
// tupleit.hh included for custom tuple iterators #include <tupleit.hh> template <typename... T> auto zip(T&... containers) -> boost::iterator_range<decltype(iterators::makeTupleIterator(std::begin(containers)...))> { return boost::make_iterator_range(iterators::makeTupleIterator(std::begin(containers)...), iterators::makeTupleIterator(std::end(containers)...)); }
Diese Vorlagenfunktion kombiniert Container zu einem boost::iterator_range, der sich wie ein Tupel-Iterator verhält und eine Sortierung mit boost::sort:
boost::sort( zip(a, b, c), [](tup_t i, tup_t j){ return i.get<0>() > j.get<0>(); });
ermöglicht Zukünftige Überlegungen
Die Antwort funktioniert für Sequenzcontainer (z. B. Vektoren), es wäre jedoch wünschenswert, sie zu erweitern zu sortierbaren Containern, die random_access und bidirektionale TupleIteratoren erfordern. Allerdings unterstützt der Standard-Sortieralgorithmus derzeit keine bidirektionalen Iteratoren.
Update
Das Mischen sequenzartiger Container (z. B. Sequenzen und Listen) ist derzeit möglich. Das Einbinden von Listen würde jedoch einen Sortieralgorithmus erfordern, der auf BidirektionalIteratoren arbeitet, was derzeit nicht in der Standardbibliothek verfügbar ist.
Das obige ist der detaillierte Inhalt vonWie kann ich mehrere Vektoren in C gleichzeitig sortieren, ohne sie zu kopieren, Boost oder STL zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!