Maison > développement back-end > C++ > Comment puis-je implémenter la fonction Zip de Python en C à l'aide de Boost ?

Comment puis-je implémenter la fonction Zip de Python en C à l'aide de Boost ?

Linda Hamilton
Libérer: 2024-12-13 06:56:12
original
384 Les gens l'ont consulté

How Can I Implement Python's Zip Function in C   Using Boost?

Implémentation du Sequence-Zipping dans C 11 via une itération de plage améliorée par Boost

L'une des améliorations clés de C 11 est la fonction basée sur la plage pour- boucle, simplifiant la syntaxe d'itération :

for(auto x: Y) {}
Copier après la connexion

Il s'agit d'une amélioration significative par rapport aux précédentes syntaxe :

for(std::vector<int>::iterator x=Y.begin(); x!=Y.end(); ++x) {}
Copier après la connexion

La question se pose : cette syntaxe simplifiée peut-elle s'étendre au bouclage sur plusieurs séquences simultanées, à l'image de la fonction zip de Python ?

Y1 = [1, 2, 3]
Y2 = [4, 5, 6, 7]
for x1,x2 in zip(Y1, Y2):
    print(x1, x2)
Copier après la connexion

Ce code génère :

(1,4) (2,5) (3,6)
Copier après la connexion

Solution avec la fonction Combine de Boost

Dans les versions Boost 1.56.0 et versions ultérieures (2014), la fonction boost::combine peut être utilisée :

#include <boost/range/combine.hpp>

int main() {
    std::vector<int> a {4, 5, 6};
    double b[] = {7, 8, 9};
    std::list<std::string> c {"a", "b", "c"};
    for (auto tup : boost::combine(a, b, c, a)) {    // <---
        int x, w;
        double y;
        std::string z;
        boost::tie(x, y, z, w) = tup;
        printf("%d %g %s %d\n", x, y, z.c_str(), w);
    }
}
Copier après la connexion

Ce code s'imprime :

4 7 a 4
5 8 b 5
6 9 c 6
Copier après la connexion

Solution avec définition de plage personnalisée ( Pré-Boost 1.56.0)

Dans les versions antérieures de Boost, définir une plage personnalisée est nécessaire :

#include <boost/iterator/zip_iterator.hpp>
#include <boost/range.hpp>

template <typename... T>
auto zip(T&amp;&amp;... containers) -> boost::iterator_range<boost::zip_iterator<decltype(boost::make_tuple(std::begin(containers)...))>>
{
    auto zip_begin = boost::make_zip_iterator(boost::make_tuple(std::begin(containers)...));
    auto zip_end = boost::make_zip_iterator(boost::make_tuple(std::end(containers)...));
    return boost::make_iterator_range(zip_begin, zip_end);
}
Copier après la connexion

L'utilisation reste la même.

Attention concernant l'itérateur Zip de Boost

Notez que le zip_iterator et boost::combine de Boost Les versions Boost antérieures à 1.63.0 (2016) peuvent entraîner un comportement indéfini ou une itération incorrecte si la longueur du conteneur d'entrée est longue. varier.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal