1

这是我的代码,每当我运行时都会在运行时引发“迭代器不可递增”错误。如果我注释掉 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++;
                }
4

1 回答 1

0

您的迭代器sp因调用而失效push_back。您正在修改小行星矢量,但您仍在使用修改前获得的旧迭代器。

这篇文章包含了迭代器失效时的规则摘要。

跟踪要处理的新项目通常使用队列(或双端队列)以安全的方式完成,如下所示:

#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(..);
 }
于 2012-10-26T16:17:02.480 回答