[英]C++ STL vector iterator… but got runtime error
我正在研究STL,並制作了win32項目。
但是我陷入了運行時錯誤..
我嘗試調試它,但是..
(部分代碼)
vector<Vertex> currPoly=polygons.back();
vector<Vertex>::iterator it;
for(it=currPoly.begin();it!=currPoly.end();++it){
vector<Vertex>::iterator p1;
vector<Vertex>::iterator n1;
vector<Vertex>::iterator n2;
if( it==currPoly.begin()){
p1=currPoly.end();
n1=it+1;
n2=it+2;
}else if( it==currPoly.end()-1){
p1=it-1;
n1=it+1;
n2=currPoly.begin();
}else if( it==currPoly.end()){
p1=it-1;
n1=currPoly.begin();
n2=currPoly.begin()+1;
}else{
p1=it-1;
n1=it+1;
n2=it+2;
}
int tmp;
tmp=it->x;
tmp=p1->x;
請點擊查看調試圖片
這很奇怪,因為
在手表桌上
n1,p1,已定義,但n2未定義,tmp也未定義。
我找不到錯在哪里...
請幫忙..
您應該對您的問題究竟是什么更加清楚...
如果您想知道為什么無法在調試器中顯示n1
和tmp
值,那是因為您正在調試發行版本(或帶有優化的某種版本),並且編譯器具有可能在執行流程的那一點“優化”了這些變量(它決定不再使用它們,或者可以在其他地方獲取它們的值)。
嘗試調試未優化的版本。
順便說一句,錯誤CXX0017(這是調試器為那些變量顯示的內容)表示“表達式計算器錯誤”。
您是否保證多邊形始終至少具有3個點? 另外,如果沒有,請仔細看看。 您是否還記得end()已經過去了? (您似乎主要是這樣做的,但是在某些情況下可能會出問題……)
注意:
}else if( it==currPoly.end()){
p1=it-1;
n1=currPoly.begin();
n2=currPoly.begin()+1;
}
這永遠都不會發生。
int tmp;
tmp=it->x;
tmp=p1->x;
這樣做似乎毫無意義。
您仍然對currPoly.end()沒有指向有效元素的想法感到困惑。 end()指向最后一個有效元素之后的1。
因為您將向量用作環,所以在向量中使用整數索引實際上是編寫代碼的更好方法。 您可以針對向量大小修改索引,而不用編寫特殊情況的代碼。 但是,由於您正在學習STL,因此我們將堅持使用迭代器。 這是我認為正確的代碼應為的樣子(我沒有對其進行編譯以查看其是否有效):
vector<Vertex> currPoly=polygons.back();
vector<Vertex>::iterator it;
for(it=currPoly.begin();it!=currPoly.end();++it){
vector<Vertex>::iterator p1;
vector<Vertex>::iterator n1;
vector<Vertex>::iterator n2;
if(it==currPoly.begin()){
p1=currPoly.end()-1;
n1=it+1;
n2=it+2;
}else if(it==currPoly.end()-1){
p1=it-1;
n1=currPoly.begin();
n2=n1+1;
}else if(it==currPoly.end()-2){
p1=it-1;
n1=it+1;
n2=currPoly.begin();
}else{
p1=it-1;
n1=it+1;
n2=it+2;
}
int tmp;
tmp=it->x;
tmp=p1->x;
}
這就是我認為基於索引的版本的樣子(再次,未使用編譯器對其進行檢查):
vector<Vertex> currPoly=polygons.back();
for(int i=0; i < currPoly.size(); ++i){
int p1 = (i+currPoly.size()-1)%currPoly.size();
int n1 = (i+1)%currPoly.size();
int n2 = (i+2)%currPoly.size();
int tmp;
tmp=currPoly[i].x;
tmp=currPoly[p1].x;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.