[問題] vector's operator[]

看板C_and_CPP (C/C++)作者 (Tom Hsu)時間13年前 (2012/07/30 11:45), 編輯推噓5(5014)
留言19則, 7人參與, 最新討論串1/1
新手小白 問題太淺請包含 看螞蟻書碰到個問題 vector超出範圍的話 如果這樣寫 vector<int> integers(10); 1. integers[5]; //這樣不會有問題 index在範圍內 2. integers[50]; //這我不太懂為啥雖然超出範圍 不會丟出例外 print出來是0 3. integers.at[50]; //這就會丟出例外了 我不太懂為啥 2超出範圍不會丟出錯誤? 2.3這兩種寫法差異為何? 謝謝指教 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.75.166.176

07/30 11:57, , 1F
2 我記得會把這個 vector 拉開到有 [50] 的樣子
07/30 11:57, 1F

07/30 11:57, , 2F
2 和 3 的差別應該是 [] 是存+取但 .at() 是單純取而已
07/30 11:57, 2F

07/30 11:58, , 3F
所以 [] 好像是會把 vector 拉長...
07/30 11:58, 3F

07/30 12:00, , 4F
查了一下資料發現我錯了 兩個都是沒抓到
07/30 12:00, 4F

07/30 12:00, , 5F
只是 .at() 是用扔例外來表示沒抓到 而 [] 則就只是回傳 0
07/30 12:00, 5F

07/30 12:01, , 6F
要拉長還是要 .resize() 才行
07/30 12:01, 6F

07/30 12:02, , 7F
也就是說你的問題的答案就只是設計如此而已
07/30 12:02, 7F

07/30 12:14, , 8F
故意這樣設計的,請參閱 The C++ Programming Language
07/30 12:14, 8F

07/30 12:19, , 9F
因為傳統陣列超界也不會丟exception?
07/30 12:19, 9F

07/30 12:24, , 10F
印象中vector::operator[]超界的話就是未定義行為
07/30 12:24, 10F

07/30 12:25, , 11F
return 0算是實作上的小小恩惠
07/30 12:25, 11F

07/30 13:35, , 12F
因為丟exception是需要額外成本的
07/30 13:35, 12F

07/30 13:36, , 13F
如果只用operator[]執行效率就和自己new陣列一樣
07/30 13:36, 13F

07/30 13:46, , 14F
2是類似直接pointer存取,3.會在有保護機制
07/30 13:46, 14F

07/30 13:51, , 15F
我看 sgi 版的原始碼,其實 at 就是額外多花成本先判斷
07/30 13:51, 15F

07/30 13:52, , 16F
07/30 13:52, 16F

07/30 13:52, , 17F
裡面有提到,兩個都是一樣的,只是at多了判斷
07/30 13:52, 17F

07/30 13:52, , 18F
要不要丟例外,後面直接用 operator[] 處理
07/30 13:52, 18F

07/30 13:52, , 19F
來決定是否要丟出excetion
07/30 13:52, 19F
文章代碼(AID): #1G5WDi-J (C_and_CPP)
文章代碼(AID): #1G5WDi-J (C_and_CPP)