Heim >Backend-Entwicklung >C++ >Wie kann ich mehrere Vektoren in C gleichzeitig sortieren, ohne sie zu kopieren, Boost oder STL zu verwenden?

Wie kann ich mehrere Vektoren in C gleichzeitig sortieren, ohne sie zu kopieren, Boost oder STL zu verwenden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-10 13:14:14848Durchsuche

How Can I Sort Multiple Vectors in C   Simultaneously Without Copying, Using Boost or the STL?

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&amp;... 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!

Stellungnahme:
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