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:
- Vektor yang diisi dengan nilai [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].
- Mengalih keluar beberapa elemen untuk mencipta vektor dengan saiz yang dikehendaki [0, 1, 2, 3, 4].
- Saiz semula vektor kepada 10 elemen menggunakan ubah saiz() lebihan yang berbeza.
- 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!