Maison >développement back-end >C++ >Comment puis-je trier plusieurs vecteurs en C sans copier de données ?

Comment puis-je trier plusieurs vecteurs en C sans copier de données ?

DDD
DDDoriginal
2024-12-05 02:24:09742parcourir

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

Tri des conteneurs zippés en C sans copie

Trier plusieurs vecteurs simultanément sans créer de copies présente un défi unique. Les solutions existantes nécessitent souvent la duplication des données dans des tuples ou des structures, ce qui est inefficace. Cette question explore une solution élégante qui exploite la puissance des bibliothèques C pour réaliser un tri sans copie.

Le problème :

L'objectif est de trier plusieurs vecteurs en une étape de verrouillage. , garantissant que les éléments correspondants restent appariés. Copier les vecteurs serait redondant et indésirable.

Tentatives infructueuses :

Bien que boost::zip_iterator et boost::range::algorithm::sort semblent prometteurs, ils rejeter les itérateurs en lecture seule et à accès non aléatoire.

Le Réponse :

Comme suggéré par Interjay, l'utilisation du TupleIteratorType personnalisé à partir de l'en-tête "tupleit.hh" nous permet de contourner les limitations des itérateurs intégrés. Cela nous permet de définir une fonction de tri personnalisée qui fonctionne directement sur les vecteurs zippés.

Voici une démonstration :

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

Ce code trie les vecteurs en place sans les copier. L'utilisation d'itérateurs personnalisés et de la fonction « trier » gère toutes les permutations nécessaires.

Extension future :

La solution actuelle fonctionne bien pour les conteneurs de séquence. Pour l'étendre à des conteneurs triables tels que des listes, RandomAccess et Bidirectionnel TupleIterators seraient nécessaires, ainsi qu'un algorithme de tri prenant en charge les itérateurs bidirectionnels.

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