Re: [問題] vector push_back fail.

看板C_and_CPP作者 (閉上眼的魚)時間15年前 (2011/01/14 19:23), 編輯推噓1(107)
留言8則, 5人參與, 最新討論串3/4 (看更多)
※ 引述《x000032001 (某數..失業中)》之銘言: : 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++)取得他的值 先謝謝您的細心回覆,同時您真的誤會了我原程式的用意, 看一下原始較為完整的程式碼 vector<int> ivec; vector< vector<int>::iterator > vit; vector<int>::iterator it, beg, end; for(vector<int>::size_type ix=0; ix<10; ++ix){ ivec.push_back(ix%3); } beg = ivec.begin(), end=ivec.end(); do{ beg = find(beg, end, 2); vit.push_back(beg++); }while(beg!=end); 完整程式碼在這裡 http://nopaste.csie.org/8b2fc 我要做的事情是,從 ivec 找出所有值為 2 的位置, 放到 vit 裡面去,所以大小有變的是 vit, 而不是 ivec, 故 Primer 上提的那點 - resize、push_back 使 iterator 失效的情形, 並不適用於這個例子。 另原推文中有其他版友也提醒我, vit 可以用 vector<int> 方式去存 vit.push_back(beg-ivec.begin()); 這倒是個不錯的方法,應是我有點念暈頭了 XD : 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() ); 剛又看了一下,試跑結果,這段碼似乎有點問題 如果找到的 value(2) 是放在 ivec 的最後一個元素 結果似乎會造成 runtime error (放上測試程式碼..) vector<int> x; x.push_back(1),x.push_back(1),x.push_back(2); vector<int>::iterator it = x.begin(); do{ it = find(it, x.end(), 2); cout << *it << endl; }while(it++!=x.end()); C++ reference 的確提供了很多、很好的資源, 只是我想把底子打深一點,不然現在這本 Primer 也不會念得這麼痛苦。 最後謝謝您的回覆與指教 小弟感激不盡 :) -- If there is no tomorrow, I want to see u last time. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.76.142

01/14 19:35, , 1F
要小心 beg - vec.begin() 不是每種 iterator 都可以用
01/14 19:35, 1F

01/14 19:41, , 2F
像map這類的好像就不適合2F這樣作XD
01/14 19:41, 2F

01/14 19:46, , 3F
謝謝 x 大指教 :)
01/14 19:46, 3F

01/14 19:48, , 4F
while(ivec.end()!=(beg = find(beg, ivec.end(),2)))
01/14 19:48, 4F

01/14 19:48, , 5F
{ ... beg++;} 的確是會多跑= =a 這樣就沒問題了
01/14 19:48, 5F

01/14 20:01, , 6F
RandomAccessIterator 才能這樣做, 最好用 distance
01/14 20:01, 6F

01/14 20:09, , 7F
謝謝 love 解答。
01/14 20:09, 7F

01/15 09:52, , 8F
v.begin() 不能確保在pushback前後的值是一樣的
01/15 09:52, 8F
※ 編輯: EdisonX 來自: 180.177.76.161 (05/12 00:53)
文章代碼(AID): #1DC396wj (C_and_CPP)
文章代碼(AID): #1DC396wj (C_and_CPP)