→ 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)