Cara Cekap untuk Memanjangkan Vektor dengan Kandungannya Sendiri
Dalam C , bekas vektor digunakan secara meluas untuk pengurusan memori dinamik. Apabila ia datang untuk menambahkan kandungan vektor pada dirinya sendiri, tanpa menggunakan gelung, pembangun sering mencari penyelesaian yang cekap.
Satu pendekatan melibatkan penggunaan fungsi std::copy. Walau bagaimanapun, seperti yang dinyatakan dalam soalan, ini boleh membawa kepada kesalahan pembahagian. Sebabnya ialah dengan hanya menyalin elemen ke penghujung vektor sedia ada bertindih dengan memori yang diduduki oleh elemen asal.
Penyelesaian yang lebih dipercayai menggunakan gabungan std::resize dan std::copy_n. Coretan kod berikut menunjukkan pendekatan ini:
auto old_count = xx.size(); xx.resize(2 * old_count); std::copy_n(xx.begin(), old_count, xx.begin() + old_count);
Pendekatan ini berfungsi dengan terlebih dahulu meningkatkan kapasiti vektor menggunakan std::resize. Memandangkan std::resize memperuntukkan semula memori jika perlu, kita perlu mengingati saiz asal menggunakan pembolehubah old_count. Operasi std::copy_n seterusnya menyalin elemen asal ke memori yang baru diperuntukkan, dengan berkesan menduplikasi kandungan vektor.
Alternatif kepada std::resize ialah std::reserve, yang hanya memperuntukkan memori yang mencukupi untuk memegang nombor yang ditentukan daripada unsur. Walau bagaimanapun, selepas menggunakan std::reserve, std::copy_n masih diperlukan kerana iterator akhir menghalakan satu elemen melepasi hujung vektor, menjadikannya tidak sah untuk sisipan.
Adalah penting untuk ambil perhatian bahawa kedua-dua std::insert dan std::push_back mungkin memerlukan pengagihan semula, yang boleh membatalkan iterator dan rujukan sedia ada sebelum titik sisipan. Oleh itu, untuk tujuan menambahkan vektor pada dirinya sendiri tanpa menggunakan gelung, gabungan std::resize atau std::reserve dan std::copy_n menyediakan penyelesaian yang boleh dipercayai dan cekap.
Atas ialah kandungan terperinci Bagaimana untuk Memanjangkan Vektor dengan Kandungannya Sendiri dengan Cekap dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!