【问题标题】:C++ STL vector iterator... but got runtime errorC++ STL 向量迭代器...但出现运行时错误
【发布时间】:2010-04-02 17:49:55
【问题描述】:

我正在学习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 也不是..

我找不到问题所在...

请帮忙..

【问题讨论】:

  • 看看这里的其他 c++ 问题,然后让你的问题看起来像他们。
  • 正如尼尔所说,发布您的代码和您遇到的 exact 错误。
  • "您尝试查看的页面是私有的。"我不想登录或注册只是为了看一张照片。
  • 对不起.. 但是编译没问题。奇怪的是在运行时缺少变量 n2 的定义..再次抱歉..我修改了级别

标签: c++ stl vector iterator


【解决方案1】:

你应该更清楚你的问题到底是什么......

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

尝试调试未优化的构建。

顺便说一句,错误 CXX0017(调试器为这些变量显示的内容)表示“表达式评估器错误”。

【讨论】:

    【解决方案2】:

    你保证多边形总是至少有 3 个点吗?另外,请仔细查看您的第一个 else if。你还记得 end() 是一个过去的结尾吗? (您似乎大多如此,但可能/有些地方出了问题……)

    【讨论】:

    • 感谢您的回答。我忘记了最后的 end() 点+1 我修改了它但仍然..程序有同样的问题..
    【解决方案3】:

    作为说明:

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

    这绝不应该发生。

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

    这看起来有点没有意义。

    【讨论】:

    • 感谢您的回答。我修改了 end() 问题。而 tmp 仅用于调试模式下的测试。
    【解决方案4】:

    您仍然对 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;
    }
    

    【讨论】:

    • 感谢您的回答。我不知道向量有 [] 运算符
    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2012-06-18
    相关资源
    最近更新 更多