使用 std::vector<Particle> 粒子;函数 .at() 不能与迭代器一起使用,它作为 for 循环中的参数


class Particles {
    constexpr static int particleNum = 25;
    constexpr static double gravity = 1.1;
    std::vector<Particle> particles;
    std::vector<Particle>::iterator it = particles.begin();
};

我正在尝试创建上面指定的25个粒子,为此,我正在使用for循环中的it迭代器,该循环正常,但是当使用particles.at(it)时,控制台输出了一个错误代码,该错误代码说:

错误:呼叫没有匹配功能 'std :: vector :: at(std :: vector :: iterator&amp;('' if(!

我尝试使用一个简单的整数来完成此任务,但是我的particles.erase(it)无法正常工作,因为它需要IT_&amp;;看看:

Particles::Particles(sf::RenderWindow& renderWindow, int x, int y) {
    for(unsigned int i = 0; i <= particleNum; i++){
        particles.push_back(Particle(x, y));
    }
    do{
        for(; it <= particles.end();){
            if (!particles.at(it).life){
                it = particles.erase(it);
            }else{
                particles.at(it).update();
                it++;
            }
            renderWindow.draw(particles.at(it).particleShape);
        }
    }while(!particles.empty());
    // to change later for different effects:
}

而无需修改您在上下文之外创建的代码,do while循环可以像这样完成:

unsigned int ctr = 0;
do{
    for(; it != particles.end(); ++it){
        ++ctr;
        if (!particles.at(ctr).life){
            it = particles.erase(it); //keep in mind erase invalidates all iterators from [it:end)
        }else{
            particles.at(ctr).update();
            it++;
        }
    }
}while(!particles.empty());

此外,还有其他几种方法可以达到所需的效果。例如,仅使用计数器,然后使用particles.begin() + ctr指定偏移量;当然,通过正确的检查,它不超过particles.end()。另一个选项而不是使用AT,即访问迭代器(如果没有结束(。例如:

do{
    for(; it != particles.end(); ++it){
        if (!it->life){
            particles.erase(it); //erase this item here
            it = particles.begin(); //reinitialize the iterator to beginning to continue searching
        }
        else{
            it->update();
            it++;
        }
    }
}while(!particles.empty());

否则,另一种可能性是根据需要致电particles.back().update()并在update呼叫后使用pop_back,或者一次检查以查看是否需要删除它。

也许还有其他/更明显的方法可以做同一件事。

您正在尝试将iterator传递给at方法,但是该方法具有类型size_type的参数,而不是std::vector::iterator&。您需要用简单的索引调用该方法,而不是迭代器。

最新更新