Isih Bekas Berzip dalam C Menggunakan Boost atau STL
Pengenalan
Soalan ini meneroka cabaran untuk menyusun berbilang vektor atau bekas bersama-sama, mengekalkan korespondensi elemen mereka, tanpa menyalinnya. Matlamatnya adalah untuk mencapai ini tanpa bergantung pada tupel atau struktur data sementara yang lain.
Soalan Asal
Soalan asal menimbulkan tugas khusus: menyusun tiga vektor, sambil memastikan bahawa unsur-unsur dalam setiap vektor disusun semula dalam susunan yang sama. Ia secara eksplisit tidak termasuk menyalin vektor ke dalam tuple atau melaksanakan fungsi pengisihan tersuai. Percubaan untuk menggunakan boost::zip_iterator atau boost::zip_range tidak berjaya disebabkan sifat akses baca sahaja dan bukan rawak bagi iterator.
Jawapan
A penyelesaian berfungsi telah disediakan oleh interjay, memanfaatkan tupleit.hh perpustakaan:
// tupleit.hh included for custom tuple iterators #include <tupleit.hh> template <typename... T> auto zip(T&... containers) -> boost::iterator_range<decltype(iterators::makeTupleIterator(std::begin(containers)...))> { return boost::make_iterator_range(iterators::makeTupleIterator(std::begin(containers)...), iterators::makeTupleIterator(std::end(containers)...)); }
Fungsi templat ini menggabungkan bekas menjadi rangsangan::iterator_range yang berkelakuan seperti iterator tuple, membenarkan pengisihan menggunakan boost::sort:
boost::sort( zip(a, b, c), [](tup_t i, tup_t j){ return i.get<0>() > j.get<0>(); });
Pertimbangan Masa Depan
Jawapan berfungsi untuk bekas jujukan (cth., vektor), tetapi adalah wajar untuk memanjangkannya ke bekas boleh diisih, yang memerlukan random_access dan TupleIterators dwiarah. Walau bagaimanapun, pada masa ini, algoritma isihan standard tidak menyokong BidirectionalIterators.
Kemas kini
Mencampurkan bekas seperti jujukan (cth., jujukan dan senarai) boleh dilakukan pada masa ini. Walau bagaimanapun, menyertakan senarai memerlukan algoritma isihan yang beroperasi pada BidirectionalIterators, yang tidak tersedia dalam pustaka standard pada masa ini.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyusun Berbilang Vektor dalam C Serentak Tanpa Menyalin, Menggunakan Boost atau STL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!