Maison >développement back-end >C++ >Comment puis-je obtenir la fonctionnalité « zip » de Python avec plusieurs plages en C 11 ?

Comment puis-je obtenir la fonctionnalité « zip » de Python avec plusieurs plages en C 11 ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-13 17:18:11474parcourir

How Can I Achieve Python's `zip` Functionality with Multiple Ranges in C  11?

Fonction Sequence-zip pour C 11 ?

La boucle for basée sur la plage en C 11 offre des améliorations significatives en termes de lisibilité et de concision du code. Il vous permet de parcourir une plage d'éléments en utilisant une syntaxe simplifiée, comme le montre :

for (auto x : Y) {}

Cependant, cette syntaxe ne s'étend pas directement au bouclage sur plusieurs plages simultanées, comme la fonction zip de Python.

Solution Boost

Avant C 11, la bibliothèque Boost fournissait deux méthodes pour émuler le zip de Python fonctionnalité :

Boost.Range.Combine :

#include <boost/range/combine.hpp>

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

Boost.Iterator.ZipIterator :

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

std::vector<int> a {4, 5, 6};
double b[] = {7, 8, 9};
std::list<std::string> c {"a", "b", "c"};

for (auto tup : zip(a, b, c, a)) {
    int x, w;
    double y;
    std::string z;
    std::tie(x, y, z, w) = tup;
    printf("%d %g %s %d\n", x, y, z.c_str(), w);
}

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