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 `std::vector::resize()` C 11 dan Boost.Container's `boost::container::vector::resize()` Sentiasa Dimulakan Nilai seperti yang Dijangkakan?

DDD
Lepaskan: 2024-12-09 08:07:06
asal
761 orang telah melayarinya

Does C  11's `std::vector::resize()` and Boost.Container's `boost::container::vector::resize()` Always Value-Initialize as Expected?

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);
}
Salin selepas log masuk

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan