Maison >développement back-end >C++ >Comment pouvons-nous obtenir la fonctionnalité Zip de Python pour une itération simultanée en C 11 ?

Comment pouvons-nous obtenir la fonctionnalité Zip de Python pour une itération simultanée en C 11 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-11 11:12:10226parcourir

How Can We Achieve Python's Zip Functionality for Simultaneous Iteration in C  11?

Fonction Zip pour l'itération séquentielle en C 11

Avec l'introduction de boucles for basées sur une plage en C 11, le bouclage sur des séquences a devenir plus concis. Cependant, parcourir plusieurs séquences simultanément pose un défi. Cet article explore des solutions pour intégrer des fonctionnalités de style zip dans les codes C 11.

La fonction zip de Python offre un moyen pratique de parcourir plusieurs listes simultanément, en associant les éléments de chaque liste. Pouvons-nous obtenir un comportement similaire avec les nouvelles fonctionnalités de C 11 ?

Itérateurs Combine et Zip de Boost

À partir de Boost 1.56.0, la fonction boost::combine est disponible pour combiner plusieurs plages en une seule plage de tuples. Chaque élément de tuple correspond à la valeur à la position actuelle dans les plages respectives.

#include <boost/range/combine.hpp>
#include <vector>
#include <list>

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)) {
        int x;
        double y;
        std::string z;
        boost::tie(x, y, z) = tup;
        printf("%d %g %s\n", x, y, z.c_str());
    }
}

Boost fournit également boost::zip_iterator à cet effet. Dans les versions antérieures de Boost, une fonction zip personnalisée peut être définie pour créer une gamme de tuples.

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

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

En utilisant ces méthodes, nous pouvons efficacement parcourir plusieurs séquences simultanément, permettant ainsi une fonctionnalité de type zip dans les codes C 11. .

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