Mengisih Bekas Berzip dalam C Tanpa Menyalin
Mengisih berbilang vektor serentak tanpa membuat salinan memberikan cabaran yang unik. Penyelesaian sedia ada selalunya memerlukan penduaan data ke dalam tuple atau struct, yang tidak cekap. Soalan ini meneroka penyelesaian elegan yang memanfaatkan kuasa perpustakaan C untuk mencapai pengisihan tanpa menyalin.
Masalahnya:
Matlamatnya adalah untuk mengisih berbilang vektor dalam langkah kunci , memastikan elemen yang sepadan kekal digandingkan. Menyalin vektor akan menjadi berlebihan dan tidak diingini.
Percubaan Gagal:
Sementara boost::zip_iterator dan boost::range::algorithm::sort nampak menjanjikan, mereka menolak akses baca sahaja dan bukan rawak iterator.
Jawapannya:
Seperti yang dicadangkan oleh interjay, menggunakan TupleIteratorType tersuai daripada pengepala "tupleit.hh" membolehkan kami memintas batasan terbina dalam iterator. Ini membolehkan kami mentakrifkan fungsi isihan tersuai yang berfungsi terus pada vektor berzip.
Berikut ialah demonstrasi:
#include "tupleit.hh" #include <vector> #include <iostream> #include <boost/range.hpp> #include <boost/range/algorithm/sort.hpp> #include <boost/range/algorithm/for_each.hpp> 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)...)); } int main() { typedef boost::tuple<int&,double&,long&> tup_t; std::vector<int> a = { 1, 2, 3, 4 }; std::vector<double> b = { 11, 22, 33, 44 }; std::vector<long> c = { 111, 222, 333, 444 }; auto print = [](tup_t t){ std::cout << t.get<0>() << " " << t.get<1>() << " " << t.get<2>() << std::endl; }; boost::for_each( zip(a, b, c), print); boost::sort( zip(a, b, c), [](tup_t i, tup_t j){ return i.get<0>() > j.get<0>(); }); for ( auto tup : zip(a, b, c) ) print(tup); return 0; }
Kod ini mengisih vektor pada tempatnya tanpa menyalinnya. Penggunaan iterator tersuai dan fungsi "isih" mengendalikan semua pilih atur yang diperlukan.
Pelanjutan Masa Depan:
Penyelesaian semasa berfungsi dengan baik untuk bekas jujukan. Untuk memanjangkannya kepada bekas boleh diisih seperti senarai, RandomAccess dan TupleIterators Dwi Arah akan diperlukan, bersama-sama dengan algoritma pengisihan yang menyokong iterator dwiarah.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Isih Berbilang Vektor dalam C Tanpa Menyalin Data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!