![](/img/trans.png)
[英]Use std::vector::iterator to alter values stored in std::vector?
[英]Accesing object stored in vector: use std::vector::at or std::vector::operator[]?
訪問vector元素時,使用at
和方括號[]
之間確實有什么區別嗎?
我看到同一個人更喜歡myvector.at()
myvector[]
之上的myvector.at()
,是否有某些東西使其更myvector.at()
,例如在某些情況下具有更好的性能,或者在某些其他語言中很常見?
主要區別在於, operator[]
是未選中的,如果您嘗試在向量的邊界之外訪問內存,則會導致未定義行為,而.at
會檢查索引,並且如果您嘗試訪問內存,則會拋出std :: out_of_range異常越界
std::vector::at
和std::vector::operator[]
之間的區別在於,如果索引無效, at
將拋出std::out_of_range
異常,而如果索引無效, operator[]
將具有未定義的行為。
那你會不會非常願意選擇的唯一原因at
是,如果你的算法依賴於一個異常被拋出了界外輸入。 這似乎是一個非常罕見的用例,因為在任何索引操作之前通過認真使用size()
來避免越界訪問是很簡單的,因此越界訪問通常只是編程錯誤。
假定越界訪問是一個錯誤而不是有效的執行路徑,則at
vs operator[]
的細目如下:
at
:
operator[]
:
總體而言,我傾向於幾乎總是使用operator[]
,並根據需要選擇優化版本或調試版本。 將錯誤轉換為運行時錯誤很少有用。
v.at(i)
檢查i
是否為有效索引(即0 <= i < v.size()
),如果不是,則引發異常。 v[i]
執行此類檢查,僅嘗試訪問基礎緩沖區,如果i
無效,則(可能)segfault *。
如果您知道索引有效,則可以使用[]
。
*正如曼卡斯(Mankarse)所說,訪問數組的邊界是未定義的行為。 UB的此特定實例通常會導致段錯誤,但也可能會做您不希望/不希望做的其他事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.