Heim > Backend-Entwicklung > C++ > Wie kann ich mehrere Vektoren in C sortieren, ohne Daten zu kopieren?

Wie kann ich mehrere Vektoren in C sortieren, ohne Daten zu kopieren?

DDD
Freigeben: 2024-12-05 02:24:09
Original
665 Leute haben es durchsucht

How Can I Sort Multiple Vectors in C   Without Copying Data?

Sortieren von komprimierten Containern in C ohne Kopieren

Das gleichzeitige Sortieren mehrerer Vektoren ohne das Erstellen von Kopien stellt eine einzigartige Herausforderung dar. Bestehende Lösungen erfordern häufig eine Duplizierung von Daten in Tupeln oder Strukturen, was ineffizient ist. Diese Frage untersucht eine elegante Lösung, die die Leistungsfähigkeit von C-Bibliotheken nutzt, um eine Sortierung ohne Kopieren zu erreichen.

Das Problem:

Das Ziel besteht darin, mehrere Vektoren im Sperrschritt zu sortieren , um sicherzustellen, dass entsprechende Elemente gepaart bleiben. Das Kopieren der Vektoren wäre überflüssig und unerwünscht.

Fehlgeschlagene Versuche:

Während boost::zip_iterator und boost::range::algorithm::sort vielversprechend erscheinen, sind sie schreibgeschützte und nicht wahlfreie Zugriffsiteratoren ablehnen.

Die Antwort:

Wie von interjay vorgeschlagen, ermöglicht uns die Verwendung des benutzerdefinierten TupleIteratorType aus dem „tupleit.hh“-Header, die Einschränkungen integrierter Iteratoren zu umgehen. Dadurch können wir eine benutzerdefinierte Sortierfunktion definieren, die direkt auf die komprimierten Vektoren wirkt.

Hier ist eine Demonstration:

#include "tupleit.hh"
#include <vector>
#include <iostream>
#include <boost/range.hpp>
#include <boost/range/algorithm/sort.hpp>
#include <boost/range/algorithm/for_each.hpp>

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)...));
}

int main() {

  typedef boost::tuple<int&amp;,double&amp;,long&amp;> tup_t;

  std::vector<int>    a = {   1,   2,   3,   4 };
  std::vector<double> b = {  11,  22,  33,  44 };
  std::vector<long>   c = { 111, 222, 333, 444 };

  auto print = [](tup_t t){ std::cout << t.get<0>() << &quot; &quot; << t.get<1>() << &quot; &quot; << t.get<2>() << std::endl; };

  boost::for_each( zip(a, b, c), print);

  boost::sort( zip(a, b, c), [](tup_t i, tup_t j){ return i.get<0>() > j.get<0>(); });

  for ( auto tup : zip(a, b, c) ) print(tup);

  return 0;
}
Nach dem Login kopieren

Dieser Code sortiert die Vektoren an Ort und Stelle, ohne sie zu kopieren. Die Verwendung von benutzerdefinierten Iteratoren und der Funktion „Sortieren“ verwaltet alle erforderlichen Permutationen.

Zukünftige Erweiterung:

Die aktuelle Lösung funktioniert gut für Sequenzcontainer. Um es auf sortierbare Container wie Listen zu erweitern, wären RandomAccess und bidirektionale TupleIteratoren erforderlich, zusammen mit einem Sortieralgorithmus, der bidirektionale Iteratoren unterstützt.

Das obige ist der detaillierte Inhalt vonWie kann ich mehrere Vektoren in C sortieren, ohne Daten zu kopieren?. 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