![](/img/trans.png)
[英]Correct way to reserve non-empty std::vector before 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.