Saya menggunakan multitreading dan ingin menggabungkan hasilnya. Sebagai contoh:
std::vector<int> A;
std::vector<int> B;
std::vector<int> AB;
Saya ingin AB harus memiliki isi A dan isi B dalam urutan itu. Apa cara paling efisien untuk melakukan sesuatu seperti ini?
Jawaban:
sumber
Ini adalah tepat apa fungsi anggota
std::vector::insert
adalah untuksumber
insert
pada iterator akses acak dan dicadangkan di muka.distance
memiliki kompleksitas O (1)). Namun, jaminan kinerjainsert
adalah sesuatu yang harus diperhatikan ketika Anda sering dapat melakukan lebih baik dengan perencanaan ke depan.size < capacity
sebagian besar waktu, prediksi cabang kemungkinan akan menyebabkan instruksi cabang yang tidak merealokasi ke dalam pipa instruksi, meminimalkan latensi yang diinduksi cabang kecuali untuk jumlah iterasi yang rendah. Ini mengasumsikan implementasi vektor yang baik, ditambah pipa instruksi CPU & prediksi cabang [baik], tetapi itu adalah asumsi yang cukup andal untuk toolchain modern dan mesin desktop. Tidak tahu tentang smartphone ..Tergantung pada apakah Anda benar-benar perlu menyatukan dua vektor secara fisik atau Anda ingin memberikan tampilan penggabungan demi iterasi. Fungsi boost :: join
http://www.boost.org/doc/libs/1_43_0/libs/range/doc/html/range/reference/utilities/join.html
akan memberimu ini.
harus memberi Anda
Catatan boost :: join tidak menyalin dua vektor ke wadah baru tetapi menghasilkan sepasang iterator (rentang) yang mencakup rentang kedua wadah. Akan ada beberapa overhead kinerja tetapi mungkin kurang dari itu menyalin semua data ke wadah baru terlebih dahulu.
sumber
Berdasarkan jawaban Kiril V. Lyadvinsky , saya membuat versi baru. Cuplikan ini menggunakan templat dan kelebihan beban. Dengan itu, Anda dapat menulis
vector3 = vector1 + vector2
danvector4 += vector3
. Semoga bisa membantu.sumber
::
diambil;)v1 + v2
tidak mewakili penambahan.@
seperti pada F #Dalam arah jawaban Bradgonesurfing, berkali-kali seseorang tidak perlu menggabungkan dua vektor (O (n)), tetapi hanya bekerja dengan mereka seolah-olah mereka digabungkan (O (1)) . Jika ini adalah kasus Anda, itu dapat dilakukan tanpa perlu meningkatkan perpustakaan.
Triknya adalah membuat proksi vektor: kelas pembungkus yang memanipulasi referensi ke kedua vektor, secara eksternal dilihat sebagai satu, yang berdekatan.
PEMAKAIAN
PENERAPAN
MANFAAT UTAMA
Ini O (1) (waktu konstan) untuk membuatnya, dan dengan alokasi memori ekstra minimal.
BEBERAPA STUFF UNTUK MEMPERTIMBANGKAN
sumber
Satu lagi varian sederhana yang belum disebutkan:
Dan menggunakan algoritma gabungan:
sumber
Jika vektor Anda diurutkan *, periksa set_union dari <algorithm>.
Ada contoh yang lebih teliti di tautan
* terima kasih rlbond
sumber
Semua solusi sudah benar, tetapi saya merasa lebih mudah hanya menulis fungsi untuk mengimplementasikan ini. seperti ini:
Dengan begitu Anda dapat menghindari penempatan sementara seperti ini:
sumber