Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Rizab Memastikan Kesahihan Rujukan Vektor Semasa Memasukkan Elemen?

Adakah Rizab Memastikan Kesahihan Rujukan Vektor Semasa Memasukkan Elemen?

Linda Hamilton
Linda Hamiltonasal
2024-10-24 10:02:30845semak imbas

Does Reserve Ensure the Validity of Vector References During Element Insertion?

Menolak Elemen daripada Vektor yang Sama

Dalam operasi vektor tertentu, seperti push_back, kapasiti dalaman mungkin perlu diagihkan semula. Ini boleh menimbulkan kebimbangan tentang kesahihan rujukan kepada elemen sebelumnya dalam vektor.

Satu kebimbangan sedemikian timbul apabila menolak elemen daripada vektor yang sama ke dalam dirinya:

<code class="cpp">vector<int> v;
v.push_back(1);
v.push_back(v[0]);</code>

Selepas tolak_balik kedua operasi, ada kemungkinan bahawa peruntukan memori vektor telah ditukar, menjadikan rujukan kepada integer pertama (iaitu, v[0]) tidak sah.

Sebagai alternatif, pertimbangkan kod berikut:

<code class="cpp">vector<int> v;
v.push_back(1);
v.reserve(v.size() + 1);
v.push_back(v[0]);</code>

Dengan memanggil rizab sebelum push_back kedua, kami memastikan bahawa vektor mempunyai kapasiti yang mencukupi untuk menampung elemen baharu tanpa memperuntukkan semula. Ini menjamin bahawa rujukan kepada integer pertama kekal sah walaupun selepas operasi.

Berdasarkan resolusi yang dicadangkan kepada laporan kecacatan LWG 526, difahamkan bahawa contoh kod pertama adalah sah kerana vektor::push_back diperlukan untuk bekerja dalam senario sedemikian. Walau bagaimanapun, untuk mengekalkan kesahihan rujukan kepada elemen terdahulu, adalah bijak untuk menggunakan kaedah rizab atau alternatif untuk mengelakkan pengagihan semula yang berpotensi.

Atas ialah kandungan terperinci Adakah Rizab Memastikan Kesahihan Rujukan Vektor Semasa Memasukkan Elemen?. 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