2012-10-26 39 views
1

这里是我运行时抛出“Iterator not incrementable”错误的代码。如果我注释掉sp ++行或者asteroids.push_back(* sp);行然后运行良好。所以它与这些行有关......我在之前的文章中看到,sp-> getSize()行也增加了指针,并且可能是问题的原因?谢谢您的帮助!运行时调试错误消息 - 迭代器不可增量

while(sp != asteroids.end()){ 
       if(sp->getSize() == .5 || sp->getSize() == 0.25){ 
        glPushMatrix(); 
        glScalef(.1, .1, .1); 
        glTranslatef(3,3,0); 
        sp->display_asteriod(sp->getSize(), random, randomTwo); 
        glPopMatrix(); 

        asteroidCount++; 
        spawn.setSize(sp->getSize()); 
        //spawn.setLife(it->getLife()); 

        random = ((double) rand()/(RAND_MAX+1)); 
        randomTwo = ((double) rand()/(RAND_MAX+1)) * 7; 
        spawn = createAsteroid(spawn); 

        x_speed_asteriod = (spawn.getXDirection())*(spawn.getRandomVelocity());// + x_speed_asteriod; 
        y_speed_asteriod = (spawn.getYDirection())*(spawn.getRandomVelocity());// + y_speed_asteriod; 
        spawn.setXSpeed(x_speed_asteriod); 
        spawn.setYSpeed(y_speed_asteriod); 

        if(spawn.getRandomAxis() == 0){ 
         glRotatef(spawn.getAngleRotation(), 1, 0, 0); 
        }else if(spawn.getRandomAxis() == 1){ 
         glRotatef(spawn.getAngleRotation(), 0, 1, 0); 
        }else if(spawn.getRandomAxis() == 2){ 
         glRotatef(spawn.getAngleRotation(), 0, 0, 1); 
        } 

        //it = asteroids.begin() + asteroidCount; 
        //asteroids.insert(it, spawn); 
        //asteroids.resize(asteroidCount); 
        asteroids.push_back(*sp); 

        glPushMatrix(); 
        glScalef(.1,.1,.1); 
        glTranslatef(spawn.getXPosition()-3, spawn.getYPosition()-3, 0); 
        spawn.display_asteriod(spawn.getSize(), random, randomTwo); 
        glPopMatrix(); 
       }else{ 
        sp++; 
       } 

回答

0

你的迭代sp是越来越通过调用push_back无效。您正在修改小行星矢量,但仍然使用修改前获得的旧迭代器。

This post包含迭代器失效时的规则摘要。

#include<deque> 

vector<Asteroid> asteroids; 

deque<Asteroid> asteroid_queue; 
//add all current asteroids into the queue 
asteroid_queue.assign(asteroids.begin(), asteroids.end()); 

while(!asteroid_queue.empty()) 
{ 
    //grab the next asteroid to process 
    Asteroid asteroid = asteroid_queue.front(); 
    //remove it from the queue 
    asteroid_queue.pop_front(); 

    do_some_work() 

    //if necessary add a new asteroid .. be careful not to end in an infinite loop 
    asteroid_queue.push_back(..); 
} 
+0

所以就我需要擦除迭代器:

保持跟踪的新项目上工作往往是在这样一个安全的方式使用队列(或双端队列)做了什么? –

+0

那么你可以尝试使用'deque'数据结构。看我的编辑。不知道这是否是你需要的。 – cyon