Heim >Backend-Entwicklung >C++ >Wie kann ich die Zip-Funktion von Python in C mit Boost implementieren?

Wie kann ich die Zip-Funktion von Python in C mit Boost implementieren?

Linda Hamilton
Linda HamiltonOriginal
2024-12-13 06:56:12430Durchsuche

How Can I Implement Python's Zip Function in C   Using Boost?

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&amp;&amp;... 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn