簡體   English   中英

在 C++ 中訪問向量的元素?

[英]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()執行邊界檢查,而[]不執行。 我能想到的更喜歡[]兩個原因是:

  1. 更簡潔的語法
  2. 表現。 當循環遍歷向量的元素時,在每次迭代中執行邊界檢查通常是過度的並且成本非常高。

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.

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