首頁 > 後端開發 > C++ > C 11 的 `std::vector::resize()` 和 Boost.Container 的 `resize()` 如何處理未初始化的元素?

C 11 的 `std::vector::resize()` 和 Boost.Container 的 `resize()` 如何處理未初始化的元素?

Linda Hamilton
發布: 2024-11-30 09:15:14
原創
875 人瀏覽過

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

C 11 和Boost.Container 中的向量行為:處理未初始化的元素

在C 應用程式中,向量通常用作臨時緩衝區。為了確保足夠的容量,這些向量通常會進行大小調整操作。在 C 03 中,std::vector::resize() 函數透過附加指定值的副本來擴展向量。雖然此方法會初始化未使用的元素,但當僅考慮向量大小時,效率可能會很低。

C 11 引入了 resize() 的兩個重載:

  • resize(size_type n):執行值未使用元素的初始化。
  • resize(size_type n, const value_type & val):用副本初始化未使用的元素

Boost.Container 透過額外的重載進一步擴展了此功能:

  • resize(size_type n, default_init_t):對未使用的元素執行預設初始化。

為了驗證這些函數的行為,使用C 11 進行了測試std::vector和boost::container::vector:

  1. 以值[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 填入向量。
  2. 刪除了一些元素以創建具有所需大小的向量[0, 1, 2, 3, 4].
  3. 使用不同的resize() 重載將向量大小調整為10個元素。
  4. 列印更新後的向量。

預期行為

對於 C 03 std::vector,未使用的元素應該用零初始化。 boost::container 變體預計在 C 03 模式下編譯時模擬 C 03 行為,並在 C 11 模式下編譯時表現出不同的行為。

實際結果

令人驚訝的是,測試結果顯示std::vector和boost::container::vector表現出相同的行為。在所有情況下,無論使用了 resize() 重載,未使用的元素都初始化為零。

解釋

這種意外行為表明 resize() 介面C 11 中引入的變更在給定場景中沒有實際效果。 C 03 std::vector::resize() 函式預設初始化未使用的元素。在 C 11 中,resize() 重載為明確初始化提供了附加選項,但它們不會改變預設初始化未使用元素的預設行為。 Boost.Container 實作中也反映了相同的行為。

意義

如果需要避免用零初始化未使用的元素,可以使用自訂分配器來攔截 std::allocator 的 construct() 方法並用預設初始化替換值初始化。但是,請謹慎行事,因為將其應用於所有初始化可能會導致意想不到的後果。

以上是C 11 的 `std::vector::resize()` 和 Boost.Container 的 `resize()` 如何處理未初始化的元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板