[問題] STL iterator 在 for 中慣用法

看板C_and_CPP作者 (Ar藤)時間11年前 (2012/08/09 18:35), 編輯推噓3(3022)
留言25則, 8人參與, 最新討論串1/1
遇到要列舉一容器(如vector)中的元素時 我看過的書都建議這樣… (A) for ( vector<myType>::iterator iter = myVect.begin(); iter != myVect.end(); ++iter ) { ... iter->xxx // blahblah ... } 而不要寫成 (B) for ( unsigned i = 0; i < myVect.size(); ++i ) { ... myVect[i].xxx // blahblah ... } 當然 map set等一定要用A 但vector中 我反而覺得A寫得很囉嗦 萬一在for主體又想取得索引值(i的值)時, 又很麻煩 (把iter - myVect.begin() ) 或者干脆用B的寫法 效率上也許 iter->xxx 比 myVect[i].xxx 快 後者多一個i的加法?? 請問A的寫法還有什麼優點呢? 感謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.36.34.134

08/09 18:51, , 1F
優點在於同樣的程式碼可以使用在 vector 以外的容器
08/09 18:51, 1F

08/09 20:09, , 2F
for (auto i : myVect) 很棒的
08/09 20:09, 2F

08/09 20:35, , 3F
樓上要小心 value semantic, 可用 auto&
08/09 20:35, 3F

08/09 21:22, , 4F
回L大 這樣的優點好像有點小 用了vector後很少改變
08/09 21:22, 4F

08/09 21:23, , 5F
所以我列舉vector時幾乎都用B的寫法
08/09 21:23, 5F

08/09 21:27, , 6F
那個優點很大!你可想一下同一份演算法給 array,list,
08/09 21:27, 6F

08/09 21:27, , 7F
c++11 完全不會...冏
08/09 21:27, 7F

08/09 21:27, , 8F
double list,deque,..., 等不同資料結構容器時,你要寫幾次
08/09 21:27, 8F

08/09 21:31, , 9F
原來是從這個角度來看 這麼說的話 假設把某個func當作
08/09 21:31, 9F

08/09 21:32, , 10F
一個algo,我會直接把container當參數傳進去 而E大的角
08/09 21:32, 10F

08/09 21:33, , 11F
度是傳一組iterator進去 這確實是滿符合STL的樣式的
08/09 21:33, 11F

08/09 21:48, , 12F
從 template function 的角度來看好了, 裡面的程式碼
08/09 21:48, 12F

08/09 21:48, , 13F
必須做到假設依賴的操作最少, 復用性最高, 所以 STL
08/09 21:48, 13F

08/09 21:49, , 14F
algos 才會依賴 iters 而已, 而且再其外輔以 traits
08/09 21:49, 14F

08/09 21:51, , 15F
和其他可特製化的 functions, 靈活度不是跟容器綁死可
08/09 21:51, 15F

08/09 21:51, , 16F
以比擬的
08/09 21:51, 16F

08/09 21:54, , 17F
(B) 的函式依賴 size() operator[]() 這些操作, 而且
08/09 21:54, 17F

08/09 21:55, , 18F
size() function 的回傳值必須能成功轉為 unsigned
08/09 21:55, 18F

08/09 21:55, , 19F
且比大小不會發生錯誤, 基本上 size() 的回傳型態是
08/09 21:55, 19F

08/09 21:56, , 20F
vector<myType>::size_type 你也用錯了, 該用什麼型態
08/09 21:56, 20F

08/09 21:56, , 21F
應該由容器決定而不是你自己
08/09 21:56, 21F

08/09 23:09, , 22F
A的i宣告可以改用auto
08/09 23:09, 22F

08/10 14:15, , 23F
如果以「這個迴圈絕對只用在這裡,也不可能把容器換掉」
08/10 14:15, 23F

08/10 14:15, , 24F
這個前提的話,用B還會有什麼壞處嗎?
08/10 14:15, 24F

08/10 14:59, , 25F
B的做法在vector上效率有比較差嗎
08/10 14:59, 25F
文章代碼(AID): #1G8v9hl_ (C_and_CPP)