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&
。您需要用简单的索引调用该方法,而不是迭代器。