Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menyusun Berbilang Vektor dalam C Serentak Tanpa Menyalin, Menggunakan Boost atau STL?

Bagaimanakah Saya Boleh Menyusun Berbilang Vektor dalam C Serentak Tanpa Menyalin, Menggunakan Boost atau STL?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-10 13:14:14851semak imbas

How Can I Sort Multiple Vectors in C   Simultaneously Without Copying, Using Boost or the STL?

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

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