Rumah >pembangunan bahagian belakang >C++ >Adakah `std::vector::resize()` C 11 dan Boost.Container's `boost::container::vector::resize()` Sentiasa Dimulakan Nilai seperti yang Dijangkakan?
Adakah Vector::resize() dalam C 11 dan Boost.Container Berkelakuan Seperti Yang Dijangkakan?
Dalam C 03, std:: fungsi vector::resize() hanya mempunyai satu beban yang boleh memulakan elemen baharu dengan nilai tertentu. C 11 memperkenalkan dua lebihan beban: ubah saiz(saiz_jenis n) untuk pemulaan nilai dan ubah saiz(saiz_jenis n, const value_type &val) untuk pemulaan salinan.
Boost.Container's boost::container::vector also supports value initialization dalam kaedah resize()nya. Walau bagaimanapun, selepas menguji kelakuan kedua-dua std::vector C 11 dan Boost.Container's boost::container::vector, diperhatikan bahawa elemen akhir yang ditambahkan pada vektor masih dimulakan dengan sifar, walaupun niatnya adalah untuk menggunakan permulaan nilai.
Memahami Yang Dijangka Gelagat:
Pengamatan nilai bermaksud elemen baharu harus dimulakan dengan nilai lalainya (cth., 0 untuk integer), manakala pemulaan salinan bermakna elemen baharu harus dimulakan dengan salinan nilai yang disediakan.
Keputusan Ujian:
Kod berikut telah digunakan untuk menguji tingkah laku:
int main() { // Initialize vectors std::vector<int> std_vec; bc::vector<int> boost_vec; bc::vector<int> boost_vec_default; // Fill and resize vectors init_vec(std_vec); init_vec(boost_vec); init_vec(boost_vec_default); // Resize vectors to 10 elements using different techniques std_vec.resize(10); boost_vec.resize(10); boost_vec_default.resize(10, bc::default_init); // Print results print_vec("std", std_vec); print_vec("boost", boost_vec); print_vec("boost w/default", boost_vec_default); }
Menyusun dalam Mod C 03:
Output dalam mod C 03 adalah seperti yang dijangkakan. Elemen baharu dalam std_vec dan boost_vec dimulakan dengan sifar, manakala elemen dalam boost_vec_default dimulakan secara lalai.
Menyusun dalam Mod C 11:
Walau bagaimanapun, output dalam C Mod 11 menunjukkan bahawa elemen baharu dalam kedua-dua std_vec dan boost_vec masih dimulakan dengan sifar. Ini menunjukkan bahawa kelakuan yang dijangkakan bagi ubah saiz(jenis_saiz n) tidak dipenuhi.
Penjelasan:
Sebab bagi kelakuan yang tidak dijangka ini ialah pengkompil mungkin sedang mengoptimumkan keluar panggilan ke beban nilai-inisialisasi resize(). Untuk menguatkuasakan pemulaan nilai, pengalokasi boleh digunakan yang mengatasi kaedah construct() untuk melaksanakan pemulaan nilai secara eksplisit.
Atas ialah kandungan terperinci Adakah `std::vector::resize()` C 11 dan Boost.Container's `boost::container::vector::resize()` Sentiasa Dimulakan Nilai seperti yang Dijangkakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!