作者EdisonX (閉上眼的魚)
看板C_and_CPP
標題Re: [問題] vector push_back fail.
時間Fri Jan 14 19:23:47 2011
※ 引述《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
→ adxis:要小心 beg - vec.begin() 不是每種 iterator 都可以用 01/14 19:35
→ x000032001:像map這類的好像就不適合2F這樣作XD 01/14 19:41
→ EdisonX:謝謝 x 大指教 :) 01/14 19:46
→ x000032001:while(ivec.end()!=(beg = find(beg, ivec.end(),2))) 01/14 19:48
→ x000032001:{ ... beg++;} 的確是會多跑= =a 這樣就沒問題了 01/14 19:48
推 loveme00835:RandomAccessIterator 才能這樣做, 最好用 distance 01/14 20:01
→ EdisonX:謝謝 love 解答。 01/14 20:09
→ ilway25:v.begin() 不能確保在pushback前後的值是一樣的 01/15 09:52
※ 編輯: EdisonX 來自: 180.177.76.161 (05/12 00:53)