簡體   English   中英

std::vector::reserve 允許在 push_back 之前隨機訪問

[英]std::vector::reserve allows random access before push_back

我最近在網上了解了std::vector::reserve 這些網站說在std::vector中保留內存不會改變std::vector的大小,而是增加了std::vector的容量。 保留后,嘗試訪問隨機元素應該會崩潰。

但是,當我運行此代碼時:

#include <iostream>
#include <vector>

using namespace std;

int main(){
    vector <int> v;
    v.reserve(1000000);
    
    v[4] = 5;
    cout << v[4] << endl; // this line and the above line should cause errors

    return 0;
}

沒發生什么事。 程序運行並在屏幕上打印5 ,我根本沒有收到任何錯誤。

我不確定我是否在這里犯了錯誤,所以有人能告訴我為什么上面的程序會運行嗎?

保留后,嘗試訪問隨機元素應該會崩潰。

不,更正確的說法是“保留后,嘗試訪問隨機元素將導致未定義的行為” (a)

而未定義的行為恰恰意味着,未定義。 它可能有效,也可能無效。 它可能看起來有效,但為您的程序稍后的嚴重失敗設置了條件。 它可能在另一個實現中不起作用,它甚至可能在一周中的某些天在同一個實現中不起作用。

歸根結底,不要這樣做。


(a) ISO C++20 中的表 69 有兩個元素訪問操作,說明完全相同:

a[n] - 返回引用,或const a const引用。 語義: *(a.begin() + n) a.at(n) - 返回引用,或const a const引用。 語義: *(a.begin() + n)

但緊隨其后的注釋澄清了區別:

成員函數at()提供對容器元素的邊界檢查訪問。 at()拋出out_of_range如果n >= a.size()

因此,如果您需要它“崩潰”(引用是因為它確實引發異常而不是崩潰),請使用后者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM