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) {}
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) {}
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)
Ce code génère :
(1,4) (2,5) (3,6)
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); } }
Ce code s'imprime :
4 7 a 4 5 8 b 5 6 9 c 6
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&&... 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); }
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!