Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Memanjangkan Vektor dengan Kandungannya Sendiri dengan Cekap dalam C?

Bagaimana untuk Memanjangkan Vektor dengan Kandungannya Sendiri dengan Cekap dalam C?

DDD
DDDasal
2024-11-11 07:57:02381semak imbas

How to Efficiently Extend a Vector with its Own Content in C  ?

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!

Kenyataan:
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