作者x000032001 (某數..失業中)
看板C_and_CPP
標題Re: [問題] vector push_back fail.
時間Fri Jan 14 18:36:44 2011
※ 引述《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