Heim >Backend-Entwicklung >C++ >Wie sortiere ich komprimierte Container in C mit Boost oder Range-v3?

Wie sortiere ich komprimierte Container in C mit Boost oder Range-v3?

DDD
DDDOriginal
2024-12-07 01:35:12312Durchsuche

How to Sort Zipped Containers in C   Using Boost or Range-v3?

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&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() {
  // 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<>{}, &amp;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!

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