Heim >Backend-Entwicklung >C++ >Wie kann ich die „Zip'-Funktionalität von Python mit mehreren Bereichen in C 11 erreichen?
Die bereichsbasierte for-Schleife in C 11 bietet erhebliche Verbesserungen bei der Lesbarkeit und Prägnanz des Codes. Sie können mit einer vereinfachten Syntax über einen Bereich von Elementen iterieren, wie in:
for (auto x : Y) {}
Diese Syntax erstreckt sich jedoch nicht direkt auf das Durchlaufen mehrerer gleichzeitiger Bereiche, wie die Zip-Funktion von Python.
Vor C 11 stellte die Boost-Bibliothek zwei Methoden zum Emulieren von Pythons Zip bereit Funktionalität:
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); }
Das obige ist der detaillierte Inhalt vonWie kann ich die „Zip'-Funktionalität von Python mit mehreren Bereichen in C 11 erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!