Maison >développement back-end >C++ >Comment puis-je simuler la fonction Zip de Python pour une boucle simultanée en C 11 à l'aide de Boost ?

Comment puis-je simuler la fonction Zip de Python pour une boucle simultanée en C 11 à l'aide de Boost ?

DDD
DDDoriginal
2024-12-10 11:09:11485parcourir

How Can I Simulate Python's Zip Function for Simultaneous Looping in C  11 Using Boost?

Fonction Zip pour simuler des boucles simultanées en C 11

L'introduction de boucles for basées sur une plage dans C 11 simplifie le bouclage sur les éléments dans un conteneur. Cependant, la question se pose de savoir s'il est possible de répliquer la fonctionnalité de la fonction zip de Python, qui permet de boucler plusieurs séquences simultanément.

Solution

Il existe plusieurs approches pour y parvenir ceci en utilisant les bibliothèques Boost :

Approche 1 : Boost Combine (Boost 1.56.0 et Plus tard)

Boost 1.56.0 a introduit la fonction boost::combine. Il permet de combiner plusieurs conteneurs de différents types dans une seule plage :

#include <boost/range/combine.hpp>

int main() {
    std::vector<int> a = {1, 2, 3};
    std::vector<char> b = {'a', 'b', 'c'};

    for (const auto& [x, y] : boost::combine(a, b)) {
        std::cout << x << " " << y << std::endl;
    }
}

Ce code affichera :

1 a
2 b
3 c

Approche 2 : Boost Zip Iterator (versions Boost antérieures)

Avant Boost 1.56.0, les bibliothèques boost::zip_iterator et boost::range peut être utilisé pour implémenter une plage zip personnalisée :

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

template <typename... T>
auto zip(const T&amp;&amp;... 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);
}

L'utilisation reste la même :

int main() {
    std::vector<int> a = {1, 2, 3};
    std::vector<char> b = {'a', 'b', 'c'};

    for (const auto& [x, y] : zip(a, b)) {
        std::cout << x << " " << y << std::endl;
    }
}

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