Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah `std::vector::resize()` dan Boost.Container's C 11 Mengendalikan Elemen Tidak Dimulakan?

Bagaimanakah `std::vector::resize()` dan Boost.Container's C 11 Mengendalikan Elemen Tidak Dimulakan?

Linda Hamilton
Lepaskan: 2024-11-30 09:15:14
asal
875 orang telah melayarinya

How Do C  11's `std::vector::resize()` and Boost.Container's `resize()`  Handle Uninitialized Elements?

Gelagat Vektor dalam C 11 dan Boost.Bekas: Mengendalikan Elemen Tidak Dimulakan

Dalam aplikasi C, vektor biasanya digunakan sebagai penimbal sementara. Untuk memastikan kapasiti yang mencukupi, vektor-vektor ini sering menjalani operasi saiz semula. Dalam C 03, fungsi std::vector::resize() mengembangkan vektor dengan menambahkan salinan nilai yang ditentukan. Walaupun pendekatan ini memulakan elemen yang tidak digunakan, ia boleh menjadi tidak cekap apabila hanya saiz vektor yang penting.

C 11 memperkenalkan dua lebihan resize():

  • resize(size_type n): Melaksanakan nilai permulaan untuk elemen yang tidak digunakan.
  • saiz (saiz_jenis n, const value_type & val): Memulakan elemen yang tidak digunakan dengan salinan nilai yang disediakan.

Boost.Container melanjutkan lagi fungsi ini dengan lebihan tambahan:

  • resize(size_type n, default_init_t ): Melakukan pemulaan lalai untuk elemen yang tidak digunakan.

Untuk mengesahkan tingkah laku ini fungsi, ujian telah dijalankan menggunakan C 11 std::vector dan boost::container::vector:

  1. Vektor yang diisi dengan nilai [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].
  2. Mengalih keluar beberapa elemen untuk mencipta vektor dengan saiz yang dikehendaki [0, 1, 2, 3, 4].
  3. Saiz semula vektor kepada 10 elemen menggunakan ubah saiz() lebihan yang berbeza.
  4. Mencetak vektor yang dikemas kini.

Gelagat Yang Dijangka

Untuk C 03 std::vector, elemen yang tidak digunakan hendaklah dimulakan dengan sifar. Rangsangan::varian bekas dijangka meniru gelagat C 03 apabila disusun dalam mod C 03 dan mempamerkan gelagat berbeza apabila disusun dalam mod C 11.

Hasil Sebenar

Yang mengejutkan, keputusan ujian mendedahkan bahawa kedua-dua std::vector dan boost::container::vector menunjukkan tingkah laku yang sama. Dalam semua kes, elemen yang tidak digunakan telah dimulakan dengan sifar, tanpa mengira beban ubah saiz() yang digunakan.

Penjelasan

Tingkah laku yang tidak dijangka ini menunjukkan bahawa antara muka ubah saiz() perubahan yang diperkenalkan dalam C 11 tidak mempunyai kesan praktikal dalam senario yang diberikan. Fungsi C 03 std::vector::resize() lalai-memulakan elemen yang tidak digunakan secara lalai. Dalam C 11, beban ubah saiz() memberikan pilihan tambahan untuk pemulaan eksplisit, tetapi ia tidak mengubah tingkah laku lalai bagi elemen tidak digunakan yang memulakan lalai. Tingkah laku yang sama ditunjukkan dalam pelaksanaan Boost.Container.

Implikasi

Jika anda perlu mengelak daripada memulakan elemen yang tidak digunakan dengan sifar, anda boleh menggunakan pengalokasi tersuai yang memintas kaedah construct() std::allocator dan menggantikan permulaan nilai dengan permulaan lalai. Walau bagaimanapun, teruskan dengan berhati-hati, kerana menggunakan ini pada semua permulaan boleh membawa kepada akibat yang tidak diingini.

Atas ialah kandungan terperinci Bagaimanakah `std::vector::resize()` dan Boost.Container's C 11 Mengendalikan Elemen Tidak Dimulakan?. 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