首頁 > 後端開發 > C++ > std::vector::reserve() 與 std::vector::resize():我什麼時候該使用哪一個?

std::vector::reserve() 與 std::vector::resize():我什麼時候該使用哪一個?

Mary-Kate Olsen
發布: 2024-12-29 13:04:22
原創
320 人瀏覽過

std::vector::reserve() vs. std::vector::resize(): When Should I Use Which?

理解差異:std::vector::resize() 與std::vector::reserve()

主題std:: vector::reserve() 與std::vector::resize() 的比較引發了程式設計社群內的討論。本文旨在闡明它們在向量操作中的不同作用。

std::vector::reserve()

std::vector::reserve() 分配記憶體指定數量的元素,但不調整向量本身的大小。該向量保持其原始邏輯大小。當您預計向向量添加元素並希望透過預先分配記憶體來優化效能時,此方法很有用。

std::vector::resize()

std: :vector::resize() 將向量的大小修改為指定的元素數量。如果向量需要擴展,它將分配額外的記憶體。與 Reserve() 不同,resize() 將所有新元素初始化為其預設值。

範例用法

考慮問題中提供的程式碼:

void MyClass::my_method()
{
    my_member.reserve(n_dim);
    for (int k = 0; k < n_dim; k++)
        my_member[k] = k;
}
登入後複製

根據回复,這裡使用reserve()是不正確的。要正確地將元素寫入向量,應該使用resize():

void MyClass::my_method()
{
    my_member.resize(n_dim);
    for (int k = 0; k < n_dim; k++)
        my_member[k] = k;
}
登入後複製

Visual Studio 2010 SP1 行為

提到的程式碼的「崩潰」行為Visual Studio 2010 SP1 中的行為與回應中所述的正確行為一致。在調整向量大小之前嘗試存取超出向量邏輯大小的元素(在本例中為 my_member[5])會導致未定義的行為。

保留和失效

需要注意的是,使用reserve()然後透過push_back()添加元素可能會使引用、迭代器或指向資料的指標無效。向量。這是因為 Reserve() 分配記憶體時沒有調整大小,當新增元素時,它們可能會被放置在不同的位置。

綜上所述,std::vector::reserve() 和 std::vector ::resize() 有不同的目的。 Reserve() 預先分配內存,而 resize() 修改向量的大小並初始化新元素。了解它們的差異對於有效的向量操作至關重要。

以上是std::vector::reserve() 與 std::vector::resize():我什麼時候該使用哪一個?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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