以下是我运行的代码,每次运行时都会在运行时抛出“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 :(得分: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(..);
}