Zip-Container in C mit Boost oder STL sortieren
Das gleichzeitige Sortieren mehrerer Container unter Beibehaltung ihrer synchronisierten Reihenfolge ist eine häufige Herausforderung. In dieser Frage werden Lösungen unter Verwendung der Boost-Bibliothek und der STL untersucht, wobei die Einschränkungen beim Kopieren von Daten in Tupel oder Strukturen angesprochen werden.
Das grundlegende Problem liegt im Verhalten von „Paaren“ von Array-Referenzen, die sich nicht an die halten erwartete Iteratoreigenschaften. Dies hat zur Entwicklung nicht konformer Iteratoren geführt, die die Werttypreferenz effektiv vom Referenztyp trennen.
Boost-Lösung
Die akzeptierte Antwort von interjay nutzt die „ tupleit.hh“-Bibliothek, die benutzerdefinierte Tupel-Iteratoren bereitstellt, die das Sortieren von gezippten Dateien ermöglichen Container.
#include "tupleit.hh" #include <vector> #include <iostream> #include <boost/range.hpp> #include <boost/range/algorithm/sort.hpp> // Custom zip function 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)...)); } int main() { // Example data std::vector<int> a = {1, 2, 3, 4}; std::vector<double> b = {11, 22, 33, 44}; std::vector<long> c = {111, 222, 333, 444}; // Sort zipped containers boost::sort(zip(a, b, c), [](auto& i, auto& j) { return i.get<0>() > j.get<0>(); }); // Print sorted results for (auto& tup : zip(a, b, c)) { std::cout << tup.get<0>() << " " << tup.get<1>() << " " << tup.get<2>() << std::endl; } return 0; }
Diese Lösung ermöglicht das Sortieren von Sequenzcontainern, ohne sie in separate Strukturen zu kopieren.
Range-v3-Lösung
Ein alternativer Ansatz Die Nutzung der Range-v3-Bibliothek, die Erweiterungen der STL vorschlägt, bietet eine elegante und prägnante Lösung Lösung.
#include <range/v3/all.hpp> #include <iostream> using namespace ranges; int main() { // Example data std::vector<int> a1{15, 7, 3, 5}; std::vector<int> a2{1, 2, 6, 21}; // Sort zipped containers sort(view::zip(a1, a2), std::less<>{}, &std::pair<int, int>::first); // Print sorted results for (auto& [x, y] : view::zip(a1, a2)) { std::cout << x << " " << y << std::endl; } }
Überlegungen zu gemischten Containern
Während sich die vorgestellten Lösungen mit der Sortierung sequenzartiger Container befassen, erweitern sie diese, um gemischte Typen (z. B. Listen) zu unterstützen und Sequenzen) würde die Entwicklung spezialisierter bidirektionaler Iteratoren und die Implementierung eines mit solchen Iteratoren kompatiblen Sortieralgorithmus erfordern. Es ist jedoch anzumerken, dass std::sort der STL keine bidirektionalen Iteratoren unterstützt.
Zusammenfassend lässt sich sagen, dass sowohl die Boost- als auch die Range-v3-Lösung effiziente und anpassbare Mittel zum Sortieren mehrerer Container im Lock-Step-Verfahren bieten und sich öffnen neue Möglichkeiten zur Datenmanipulation in C .
Das obige ist der detaillierte Inhalt vonWie sortiere ich komprimierte Container in C mit Boost oder Range-v3?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!