簡體   English   中英

C ++ STL向量迭代器…但是出現運行時錯誤

[英]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也未定義。

我找不到錯在哪里...

請幫忙..

您應該對您的問題究竟是什么更加清楚...

如果您想知道為什么無法在調試器中顯示n1tmp值,那是因為您正在調試發行版本(或帶有優化的某種版本),並且編譯器具有可能在執行流程的那一點“優化”了這些變量(它決定不再使用它們,或者可以在其他地方獲取它們的值)。

嘗試調試未優化的版本。

順便說一句,錯誤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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM