精華區beta C_and_CPP 關於我們 聯絡資訊
我寫了這樣的一個程式 #include<vector> #include<iostream> using namespace std; void main() { vector<int> v; vector<int>::iterator itr=v.begin(); v.push_back(1); cout<<*itr; } 在VC6裡,這個程式可以print出1, 可是在.NE裡,卻會出現run time的錯誤, 他會說對xxx位址的存取違規, 請問*itr這樣的語法在stl裡是不合常規的嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.28.250
sekya:我不覺得你用的是正常的... 59.104.35.63 06/28
UNARYvvv:因為這樣的寫法根本就是錯的.. 61.59.30.19 06/28
UNARYvvv:而你的實驗結果只能說又是一個 VC6 的受害案例. 61.59.30.19 06/28
> -------------------------------------------------------------------------- < 作者: renderer (rendering) 看板: C_and_CPP 標題: Re: [問題] STL在VC6與在.NET裡的不同? 時間: Tue Jun 28 22:47:08 2005 ※ 引述《rollingcom (不是lolicon)》之銘言: : 我寫了這樣的一個程式 : #include<vector> : #include<iostream> : using namespace std; : void main() : { : vector<int> v; : vector<int>::iterator itr=v.begin(); : v.push_back(1); : cout<<*itr; : } : 在VC6裡,這個程式可以print出1, : 可是在.NE裡,卻會出現run time的錯誤, : 他會說對xxx位址的存取違規, : 請問*itr這樣的語法在stl裡是不合常規的嗎? vector<int> v; 初始長度為零 哪來的 v.begin() 呢 換一下順序吧: vector<int> v; v.push_back(1); vector<int>::iterator itr = v.begin(); cout << *itr; -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.228.216.130
UNARYvvv:在大小零的情況下還是有 begin(),等於 end() 61.59.30.19 06/28
UNARYvvv:當然此時沒有使用價值就是了..... 61.59.30.19 06/28
renderer:嗯嗯 多謝提醒 61.228.216.130 06/28
> -------------------------------------------------------------------------- < 作者: khoguan (Khoguan Phuann) 看板: C_and_CPP 標題: Re: [問題] STL在VC6與在.NET裡的不同? 時間: Tue Jun 28 22:52:50 2005 ※ 引述《rollingcom (不是lolicon)》之銘言: : 我寫了這樣的一個程式 : #include<vector> : #include<iostream> : using namespace std; : void main() : { : vector<int> v; : vector<int>::iterator itr=v.begin(); : v.push_back(1); : cout<<*itr; : } : 在VC6裡,這個程式可以print出1, : 可是在.NE裡,卻會出現run time的錯誤, : 他會說對xxx位址的存取違規, : 請問*itr這樣的語法在stl裡是不合常規的嗎? 上述不合常規的地方是,先取得了一個 iterator 然後 又對 vector 做了新增元素的動作,接著未再重新更新 iterator 就使用它, 這樣用是不行的。對一個具有動 態重新分配空間以接受隨時新增元素這種性質的 vector push_back 東西,當然可能導致舊有的 iterator 失效。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.130.208.168 > -------------------------------------------------------------------------- < 作者: aoc90058 (我是新警察Orz...) 看板: C_and_CPP 標題: Re: [問題] STL在VC6與在.NET裡的不同? 時間: Tue Jun 28 23:05:58 2005 對vector做意圖加大"大小"(Size)時, 則它的Iterator將不再給予保證,也就 是會散失他的功能... 呼拉拉= = -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.134.89.111 ※ 編輯: aoc90058 來自: 220.134.89.111 (06/28 23:06) ※ 編輯: aoc90058 來自: 220.134.89.111 (06/30 11:00) > -------------------------------------------------------------------------- < 作者: UNARYvvv (有趣生活) 看板: C_and_CPP 標題: Re: [問題] STL在VC6與在.NET裡的不同? 時間: Tue Jun 28 23:40:26 2005 ※ 引述《rollingcom (不是lolicon)》之銘言: : 我寫了這樣的一個程式 : #include<vector> : #include<iostream> : using namespace std; : void main() : { : vector<int> v; : vector<int>::iterator itr=v.begin(); : v.push_back(1); : cout<<*itr; : } : 在VC6裡,這個程式可以print出1, : 可是在.NE裡,卻會出現run time的錯誤, : 他會說對xxx位址的存取違規, : 請問*itr這樣的語法在stl裡是不合常規的嗎? #include <iostream> #include <vector> using namespace std; int main(){ vector<int> v; vector<int>::iterator iv=v.begin(); v.push_back(0); cout << "(iv == v.begin()) is " << boolalpha << (iv == v.begin()) << endl; // cout<<*iv; // cause the program crashed return 0; } 你可以觀察一下 更動 vector 大小之後 原先的 begin() 跟後來的是否相同,就知道錯在哪了 至於詳細原因,我想前幾篇的大大也都提過了 事實上那行 cout<<*iv; 不論我在 VC.NET 2003 還是 VC6,執行到該處都會發生錯誤 而我的 VC6 是 SP6 的 不知道為什麼你的 VC6 還可以跑出正確結果.. 也許你用的那版..先後 begin() 結果剛好是一樣的 那也就是一個剛好成功的特例吧 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.59.30.19 > -------------------------------------------------------------------------- < 作者: rollingcom (不是lolicon) 看板: C_and_CPP 標題: Re: [問題] STL在VC6與在.NET裡的不同? 時間: Wed Jun 29 02:13:20 2005 ※ 引述《khoguan (Khoguan Phuann)》之銘言: : : 在VC6裡,這個程式可以print出1, : : 可是在.NE裡,卻會出現run time的錯誤, : : 他會說對xxx位址的存取違規, : : 請問*itr這樣的語法在stl裡是不合常規的嗎? : 上述不合常規的地方是,先取得了一個 iterator 然後 : 又對 vector 做了新增元素的動作,接著未再重新更新 : iterator 就使用它, 這樣用是不行的。對一個具有動 : 態重新分配空間以接受隨時新增元素這種性質的 vector : push_back 東西,當然可能導致舊有的 iterator 失效。 orz...這個我知道... 可是每次寫都會忘記... 其實我原本要試的是在.NET下, #include<vector> #include<iostream> using namespace std; void main() { vector<int> v; vector<int>::iterator itr; v.push_back(1); itr=v.begin(); ... //line5 ... } 像在這種情況下,我如果用step-by-step來trace的話, 跑到line5時,我要用什麼方法才能看到在watch試窗內看到*itr的內容呢? 我在watch視窗內加入*itr的話,會顯示"型別與運算子不相容" 可是又沒有compile time的error -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.28.250 > -------------------------------------------------------------------------- < 作者: khoguan (Khoguan Phuann) 看板: C_and_CPP 標題: Re: [問題] STL在VC6與在.NET裡的不同? 時間: Wed Jun 29 23:34:06 2005 ※ 引述《rollingcom (不是lolicon)》之銘言: : 其實我原本要試的是在.NET下, : #include<vector> : #include<iostream> : using namespace std; : void main() : { : vector<int> v; : vector<int>::iterator itr; : v.push_back(1); : itr=v.begin(); : ... //line5 *ite; // 直接寫進程式中 debug 用 : ... : } : 像在這種情況下,我如果用step-by-step來trace的話, : 跑到line5時,我要用什麼方法才能看到在watch試窗內看到*itr的內容呢? : 我在watch視窗內加入*itr的話,會顯示"型別與運算子不相容" : 可是又沒有compile time的error 它沒有那麼厲害的啦。對於 overloaded operator來說,watch視窗 得要另外去執行相關的程式碼才能得出 *itr 的值,它無法做到這種 程度,只能針對內建的 operator. 所以這種情形,直接在程式中把要 evaluate 的 expression 寫出來,debugger 執行到那裡,自然能顯示 其值。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 編輯: khoguan 來自: 220.130.208.168 (06/29 23:37)