Maison >développement back-end >C++ >Comment trier les conteneurs zippés en C à l'aide de Boost ou Range-v3 ?

Comment trier les conteneurs zippés en C à l'aide de Boost ou Range-v3 ?

DDD
DDDoriginal
2024-12-07 01:35:12312parcourir

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

Tri des conteneurs zippés en C à l'aide de Boost ou du STL

Trier plusieurs conteneurs simultanément tout en conservant leur ordre synchronisé est un défi courant. Cette question explore des solutions utilisant la bibliothèque Boost et la STL, abordant les limites de la copie de données dans des tuples ou des structures.

Le problème fondamental réside dans le comportement des "paires" de références de tableau, qui n'adhèrent pas aux caractéristiques attendues de l’itérateur. Cela a conduit au développement d'itérateurs non conformes qui dissocient efficacement la référence du type valeur du type référence.

Solution Boost

La réponse acceptée d'Interjay exploite le " tupleit.hh", qui fournit des itérateurs de tuple personnalisés qui permettent le tri des fichiers compressés conteneurs.

#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;
}

Cette solution permet de trier les conteneurs de séquence sans les copier dans des structures distinctes.

Solution Range-v3

Une approche alternative l'utilisation de la bibliothèque range-v3, qui propose des extensions au STL, offre un aperçu élégant et concis solution.

#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;
  }
}

Considérations relatives aux conteneurs mixtes

Bien que les solutions présentées abordent le tri des conteneurs de type séquence, elles sont étendues pour prendre en charge des types mixtes (par exemple, des listes et séquences) nécessiterait le développement d’itérateurs bidirectionnels spécialisés et la mise en œuvre d’un algorithme de tri compatible avec de tels itérateurs. Cependant, il convient de noter que le std::sort de STL ne prend pas en charge les bidirectionnels.

En conclusion, les solutions Boost et range-v3 fournissent des moyens efficaces et personnalisables pour trier plusieurs conteneurs en une étape de verrouillage, ouvrant de nouvelles possibilités de manipulation de données en C .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn