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&... 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<>{}, &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!