Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Melaksanakan Fungsi Zip Python dalam C Menggunakan Boost?

Bagaimanakah Saya Boleh Melaksanakan Fungsi Zip Python dalam C Menggunakan Boost?

Linda Hamilton
Linda Hamiltonasal
2024-12-13 06:56:12381semak imbas

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

Melaksanakan Urutan-Zipping dalam C 11 melalui Boost-Enhanced Julat Lelaran

Salah satu peningkatan utama C 11 ialah berasaskan julat untuk- gelung, memudahkan sintaks lelaran:

for(auto x: Y) {}

Ini ialah peningkatan yang ketara berbanding sintaks sebelumnya:

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

Timbul persoalan: bolehkah sintaks yang dipermudahkan ini dilanjutkan ke gelung berbilang jujukan serentak, serupa dengan fungsi zip Python?

Y1 = [1, 2, 3]
Y2 = [4, 5, 6, 7]
for x1,x2 in zip(Y1, Y2):
    print(x1, x2)

Kod ini output:

(1,4) (2,5) (3,6)

Penyelesaian dengan Boost's Combine Fungsi

Dalam Boost versi 1.56.0 dan lebih baru (2014), fungsi boost::combine boleh digunakan:

#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);
    }
}

Kod ini mencetak:

4 7 a 4
5 8 b 5
6 9 c 6

Penyelesaian dengan Definisi Julat Tersuai (Pra-Boost 1.56.0)

Dalam versi Boost terdahulu, penentuan julat tersuai adalah perlu:

#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);
}

Penggunaan kekal sama.

Awas untuk Boost's Zip Iterator

Perhatikan bahawa Boost's zip_iterator dan boost::combine dalam versi Boost sebelum 1.63.0 (2016) boleh mengakibatkan tingkah laku yang tidak ditentukan atau lelaran yang salah jika panjang bekas input berbeza-beza.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Fungsi Zip Python dalam C Menggunakan Boost?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn