Re: [問題] vector push_back fail.
※ 引述《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
01/14 19:35, 1F
→
01/14 19:41, , 2F
01/14 19:41, 2F
→
01/14 19:46, , 3F
01/14 19:46, 3F
→
01/14 19:48, , 4F
01/14 19:48, 4F
→
01/14 19:48, , 5F
01/14 19:48, 5F
推
01/14 20:01, , 6F
01/14 20:01, 6F
→
01/14 20:09, , 7F
01/14 20:09, 7F
→
01/15 09:52, , 8F
01/15 09:52, 8F
※ 編輯: EdisonX 來自: 180.177.76.161 (05/12 00:53)
討論串 (同標題文章)
完整討論串 (本文為第 3 之 4 篇):