Implementierung von Sequence-Zipping in C 11 durch Boost-Enhanced Range Iteration
Eine der wichtigsten Verbesserungen von C 11 ist das bereichsbasierte For- Schleife, Vereinfachung der Iterationssyntax:
for(auto x: Y) {}
Dies ist eine deutliche Verbesserung gegenüber den vorherigen Syntax:
for(std::vector<int>::iterator x=Y.begin(); x!=Y.end(); ++x) {}
Es stellt sich die Frage: Kann sich diese vereinfachte Syntax auf die Schleife über mehrere gleichzeitige Sequenzen erstrecken, ähnlich der Zip-Funktion von Python?
Y1 = [1, 2, 3] Y2 = [4, 5, 6, 7] for x1,x2 in zip(Y1, Y2): print(x1, x2)
Dieser Code gibt Folgendes aus:
(1,4) (2,5) (3,6)
Lösung mit Boost-Kombinationsfunktion
In Boost-Versionen 1.56.0 und höher (2014) kann die Funktion boost::combine verwendet werden:
#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); } }
Dieser Code gibt Folgendes aus:
4 7 a 4 5 8 b 5 6 9 c 6
Lösung mit benutzerdefinierter Bereichsdefinition ( Vor Boost 1.56.0)
In früheren Boost-Versionen ist das Definieren eines benutzerdefinierten Bereichs erforderlich notwendig:
#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); }
Die Verwendung bleibt gleich.
Achtung für den Zip-Iterator von Boost
Beachten Sie, dass der zip_iterator und boost::combine von Boost verwendet werden Boost-Versionen vor 1.63.0 (2016) können zu undefiniertem Verhalten oder falscher Iteration führen, wenn die Länge des Eingabecontainers zunimmt variieren.
Das obige ist der detaillierte Inhalt vonWie kann ich die Zip-Funktion von Python in C mit Boost implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!