C ++ STL矢量迭代器......但是遇到了运行时错误

时间:2010-04-02 17:49:55

标签: c++ stl vector iterator

我正在学习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;

click查看调试图片

这很奇怪,因为

在观察表中,

n1,p1,它被定义但是n2不是 和tmp也不是..

我找不到有什么问题......

请帮助..

4 个答案:

答案 0 :(得分:1)

你应该更确切地了解你的问题是什么......

如果您想知道为什么n1tmp的值无法在调试器中显示,我猜这是因为您正在调试发布版本(或者某些版本)使用优化构建的类型,并且编译器可能已经在执行流程中的那一点“优化掉”那些变量(它决定它们不再被使用或者它们的值可以在其他地方获得)。

尝试调试非优化版本。

顺便说一句,错误CXX0017(这是调试器为这些变量显示的内容)意味着“Expression Evaluator Error”。

答案 1 :(得分:0)

您是否保证多边形总是至少有3个点?另外,仔细看看你的第一个if。你还记得那个结尾()是结束的吗? (你似乎很喜欢,但可能存在某些地方出现问题的地方......)

答案 2 :(得分:0)

作为说明:

}else if(   it==currPoly.end()){
    p1=it-1;
    n1=currPoly.begin();
    n2=currPoly.begin()+1;
}

这绝不会发生。

int tmp;
tmp=it->x;
tmp=p1->x;

这看起来有点无意义。

答案 3 :(得分:0)

你仍然遇到currPoly.end()没有指向有效元素的想法。 最后一个有效元素后,end()指向一个

因为您使用向量作为环,所以在向量中使用整数索引实际上是编写代码的更好方法。您可以根据矢量大小修改索引,而不是编写特殊情况代码。但是既然你要学习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;
}