看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《EdisonX (閉上眼的魚)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : vs 2008 : 問題(Question): : primer ch9 剛念完,裡面提到 find , : 於是實做了類似下面的東西 : beg = ivec.begin(), end=ivec.end(); : do{ : beg = find(beg, end, 2); : vit.push_back(beg++); : }while(beg!=end); : 完整程式碼及錯誤視窗於下連結, : 於執行期會失敗, 不知是不是我哪裡觀念有問題 push_back的用途是在尾端新增一個數值 如果你的vector是這樣 ┌─┬─┬─┬─┐ │0│1│2│3│ └─┴─┴─┴─┘ ↑ ↑ begin end 那麼它會在最後插入數值 變成 (以ivec.push_back(4)為例) ┌─┬─┬─┬─┬─┐ │0│1│2│3│4│ └─┴─┴─┴─┴─┘ ↑ ↑ begin end 那麼回到你的程式碼 會發現幾個錯誤 beg = ivec.begin(), end = ivec.end(); do{ beg = find(beg, end, 2); vit.push_back(beg++); //插入一個迭代器 這是一個讓我不解的行為 //如果你要使用它的值 那應該用*(beg++)取得他的值 }while(beg!=end); 再來這個程式碼還有一個錯誤 如果我想的沒錯的話 code應該是尋找vector中值為2的數字 由於find回傳的是迭代器 所以用beg接是沒錯的 但是primer應該有告訴你如果更動container的值會造成迭代器無效 所以while那行應該寫成while(beg!=ivec.end()); 而為了避免別人誤解最好是不要把變數隨意的取成beg 最後要告訴你使用find時 如果找不到則回傳你傳入的end 但是在判斷式之前改變值的話 就會發生錯誤 以你的程式來說在find後你做了++的動作 會導致無窮迴圈 一種解法是在迴圈內用這樣的寫法 if( ivec.end() == (beg = find(beg, ivec.end(), 2)) ) break; 最後提供一下我會寫的寫法 vector<int>::iterator it = ivec.begin(); do{ it = find(it, ivec.end(), 2); // Do something /* 像是 cout << (*it) << endl; vit.push_back(*it); */ }while( it++ != ivec.end() ); : 錯誤結果(Wrong Output): : http://ppt.cc/9pfV : 程式碼(Code):(請善用置底文網頁, 記得排版) : http://nopaste.csie.org/8b2fc : 補充說明(Supplement): : Primer 第二篇是不是要懂資料結構、演算法才念得下去? : (資料結構我只知道 link list,演算法完全沒學過,只知道幾個簡單的排序) : 我覺得現在念得好痛苦,是不是要有其它的輔助書籍? : 謝謝各位。 http://www.cplusplus.com/reference/stl/vector/ 其實不用懂太多資結跟演算法 那只是讓你瞭解實作 重要的是要懂得這個STL container跟他的member的用法 還有STL algorithm的用法和精神 建議可以看上面那個網站 裡面會有example code讓你知道member function的用法 有時候自己動手寫個程式跑跑看也是不錯的方法 畢竟學程式就是要拿來寫的 -- 有錯請指教 不能自刪讓我發文變的很小心XDD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.240.38.38
EdisonX:說抱歉的是,我的變數命名不好讓您誤會,另您這篇的例子會有 01/14 19:50
EdisonX:個 runtime error,下面回文已補上,謝謝您的指教,再次感謝. 01/14 19:50