簡體   English   中英

訪問存儲在vector中的對象:使用std :: vector :: at還是std :: vector :: operator []?

[英]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::atstd::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.

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