[英]Accessing elements of a vector in C++?
我經常發現人們使用數組方括號 [] 和法向量函數 .at()。 為什么有兩種不同的方法? 兩者的優點和缺點是什么? 我知道 .at() 更安全,但是有沒有 .at() 不能使用的情況? 如果 .at() 總是更安全,為什么還要使用數組括號 []。
我四處搜索,但找不到類似的問題。 如果這樣的問題已經存在,請轉發給我,我會刪除這個問題。
std::vector::at()
通過拋出std::out_of_range
異常來保護您免於訪問超出范圍的數組元素,這與[]
運算符不同,后者在訪問超出向量范圍時不會警告或拋出異常。
std::vector
是/被認為是 C99 中可變長度數組 (VLA) 的 C++ 替換/構造。 為了讓 c 風格的數組能夠被std::vector
輕松替換, std::vector
需要提供一個與數組類似的接口,因此 vector 提供了一個[]
操作符來訪問它的元素。 同時,C++ 標准委員會可能也覺得需要為std::vector
比 c 樣式數組更多的安全性,因此他們還提供了提供它的std::vector::at()
方法。
自然地, std::vector::at()
方法在取消引用之前檢查向量的大小,這將是通過[]
訪問元素的一點開銷(在大多數用例中可能可以忽略不計),所以std::vector
為您提供安全或更快的選擇,但以犧牲自己管理安全為代價。
正如其他人提到的, at()
執行邊界檢查,而[]
不執行。 我能想到的更喜歡[]
兩個原因是:
at()
優點:
缺點:
operator[]
優點:
缺點:
個人選擇
有些人使用下標運算符的原因是他們直觀,因為向量類似於訪問項目的數組,這種方式只是簡單地作為“語法糖”,這意味着它看起來更好。
有些人喜歡[]
,有些人喜歡.at()
,這是個人選擇。
技術選擇
假設您只討論訪問,Function .at()
會進行邊界檢查,當您嘗試訪問超出邊界的項目時,它會拋出異常。 該函數“更安全”,但如果您自己處理邊界檢查,請隨意使用下標運算符!
所以真的由你來選擇你使用哪種風格的配飾!
你是對的 .at() 更安全,因為它會檢查數組邊界。 operator[] 跳過檢查,如果您進行非法訪問則未定義。
C/C++ 中的傳統數組訪問從未進行過數組邊界檢查,在 Java 引入之前的 90 年代,許多人認為這會增加不可接受的開銷。 我相信,總的來說,今天的情況並非如此,也不像當時許多人所認為的那樣真實。 我確信在某些情況下它很重要,但一般來說,如果您發現迫切需要這樣做,最好先安全啟動並切換。
下標操作符涉及的類型較少,這使得代碼更加清晰。 此外,從 C 數組重構到/從 C 數組重構是很自然的。
我使用STLPort 5.2.
似乎at()
進行范圍檢查。
參考at(size_type __n) { _M_range_check(__n); return (*this)[__n]; }
at(size_type __n) { _M_range_check(__n); return (*this)[__n]; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.