Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Isih Berbilang Vektor dalam C Tanpa Menyalin Data?

Bagaimanakah Saya Boleh Isih Berbilang Vektor dalam C Tanpa Menyalin Data?

DDD
Lepaskan: 2024-12-05 02:24:09
asal
665 orang telah melayarinya

How Can I Sort Multiple Vectors in C   Without Copying Data?

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&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)...));
}

int main() {

  typedef boost::tuple<int&amp;,double&amp;,long&amp;> 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>() << &quot; &quot; << t.get<1>() << &quot; &quot; << 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;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan