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);
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));
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!