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
Freigeben: 2024-12-13 06:56:12
Original
385 Leute haben es durchsucht

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) {}
Nach dem Login kopieren

Dies ist eine deutliche Verbesserung gegenüber den vorherigen Syntax:

for(std::vector<int>::iterator x=Y.begin(); x!=Y.end(); ++x) {}
Nach dem Login kopieren

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)
Nach dem Login kopieren

Dieser Code gibt Folgendes aus:

(1,4) (2,5) (3,6)
Nach dem Login kopieren

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);
    }
}
Nach dem Login kopieren

Dieser Code gibt Folgendes aus:

4 7 a 4
5 8 b 5
6 9 c 6
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage