Bagaimana untuk Menduakan Vektor dengan Cekap dalam C Tanpa Gelung?

Barbara Streisand
Lepaskan: 2024-11-08 16:47:01
asal
166 orang telah melayarinya

How to Efficiently Duplicate a Vector in C   Without Loops?

Mencipta Pendua Vektor

Apabila menambahkan vektor pada dirinya sendiri, adalah wajar untuk mengelak daripada menggunakan gelung atas sebab prestasi. Fungsi std::vector::insert, manakala pilihan, tidak membenarkan penggunaan iterator untuk *ini.

Mendekati Masalah dengan std::copy

Menggunakan std::copy untuk menyelesaikan isu ini mungkin kelihatan seperti penyelesaian, tetapi pendekatan ini boleh membawa kepada pembahagian kesalahan.

Penyelesaian Optimum

Penyelesaian optimum melibatkan penggunaan kedua-dua saiz semula (atau rizab) dan copy_n. Begini cara ia berfungsi:

auto old_count = xx.size();
xx.resize(2 * old_count);
std::copy_n(xx.begin(), old_count, xx.begin() + old_count);
Salin selepas log masuk

Kod ini mula-mula menyimpan saiz vektor asal dalam old_count. Kemudian ia mengubah saiz xx untuk menggandakan kapasitinya. Akhir sekali, std::copy_n menyalin elemen dari awal xx hingga akhir xx, menduplikasi vektor dengan berkesan.

Sebagai alternatif, anda boleh menggunakan rizab dan bukannya mengubah saiz:

auto old_count = xx.size();
xx.reserve(2 * old_count);
std::copy_n(xx.begin(), old_count, std::back_inserter(xx));
Salin selepas log masuk

Apabila menggunakan rizab, copy_n adalah penting kerana lelaran end() menghala ke hujung, menjadikannya tidak sah untuk sisipan.

Pendekatan ini memenuhi syarat yang digariskan dalam 23.3.6.5 [vector.modifiers], memastikan lelaran dan rujukan sebelum titik sisipan kekal sah dan tiada pengagihan semula berlaku jika boleh.

Atas ialah kandungan terperinci Bagaimana untuk Menduakan Vektor dengan Cekap dalam C Tanpa Gelung?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan