看板 C_and_CPP 關於我們 聯絡資訊
遇到要列舉一容器(如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
LPH66:優點在於同樣的程式碼可以使用在 vector 以外的容器 08/09 18:51
legendmtg:for (auto i : myVect) 很棒的 08/09 20:09
loveme00835:樓上要小心 value semantic, 可用 auto& 08/09 20:35
Arton0306:回L大 這樣的優點好像有點小 用了vector後很少改變 08/09 21:22
Arton0306:所以我列舉vector時幾乎都用B的寫法 08/09 21:23
EdisonX:那個優點很大!你可想一下同一份演算法給 array,list, 08/09 21:27
Arton0306:c++11 完全不會...冏 08/09 21:27
EdisonX:double list,deque,..., 等不同資料結構容器時,你要寫幾次 08/09 21:27
Arton0306:原來是從這個角度來看 這麼說的話 假設把某個func當作 08/09 21:31
Arton0306:一個algo,我會直接把container當參數傳進去 而E大的角 08/09 21:32
Arton0306:度是傳一組iterator進去 這確實是滿符合STL的樣式的 08/09 21:33
loveme00835:從 template function 的角度來看好了, 裡面的程式碼 08/09 21:48
loveme00835:必須做到假設依賴的操作最少, 復用性最高, 所以 STL 08/09 21:48
loveme00835:algos 才會依賴 iters 而已, 而且再其外輔以 traits 08/09 21:49
loveme00835:和其他可特製化的 functions, 靈活度不是跟容器綁死可 08/09 21:51
loveme00835:以比擬的 08/09 21:51
loveme00835:(B) 的函式依賴 size() operator[]() 這些操作, 而且 08/09 21:54
loveme00835:size() function 的回傳值必須能成功轉為 unsigned 08/09 21:55
loveme00835:且比大小不會發生錯誤, 基本上 size() 的回傳型態是 08/09 21:55
loveme00835:vector<myType>::size_type 你也用錯了, 該用什麼型態 08/09 21:56
loveme00835:應該由容器決定而不是你自己 08/09 21:56
diabloevagto:A的i宣告可以改用auto 08/09 23:09
james732:如果以「這個迴圈絕對只用在這裡,也不可能把容器換掉」 08/10 14:15
james732:這個前提的話,用B還會有什麼壞處嗎? 08/10 14:15
Donze:B的做法在vector上效率有比較差嗎 08/10 14:59