Как может я циклично выполняться через stl:: Перечислите и сохраните значение одного из объектов для использования позже в функции?
Particle *closestParticle;
for(list<Particle>::iterator p1 = mParticles.begin(); p1 != mParticles.end(); ++p1 )
{
// Extra stuff removed
closestParticle = p1; // fails to compile (edit from comments)
}
Либо
Particle *closestParticle;
for(list<Particle>::iterator it=mParticles.begin(); it!=mParticles.end(); ++it)
{
// Extra stuff removed
closestParticle = &*it;
}
либо
list<Particle>::iterator closestParticle;
for(list<Particle>::iterator it=mParticles.begin(); it!=mParticles.end(); ++it )
{
// Extra stuff removed
closestParticle = it;
}
либо
inline list<Particle>::iterator findClosestParticle(list<Particle>& pl)
{
for(list<Particle>::iterator it=pl.begin(); it!=pl.end(); ++it )
{
// Extra stuff removed
return it;
}
return pl.end();
}
либо
template< typename It >
inline It findClosestParticle(It begin, It end)
{
while(begin != end )
{
// Extra stuff removed
return begin;
++begin;
}
return end;
}
Они отсортированы по возрастанию личных предпочтений. :)
Я не эксперт по STL, но считаю, что причина его неудачной компиляции в том, что итератор - это объект, указывающий на другой объект. Другими словами, итератор - это обобщение указателя. Итак, чтобы сделать то, что вы хотите, с минимальными изменениями в вашем коде, вам сначала нужно отменить ссылку на итератор, чтобы получить значение, которое он содержит. Затем вы использовали бы '&', чтобы получить его адрес, а затем назначили бы этот адрес своей переменной-указателю. Вот почему ptr = & * it; работает.
Для списка
единственный способ сделать итератор недействительным - это стереть
его. Я подозреваю, что вы вызываете list.erase (p1)
в какой-то момент цикла. Вам нужно сделать копию итератора, переместить p1
назад, а затем стереть копию.
РЕДАКТИРОВАТЬ: Ой, подождите, вы имели в виду, что не компилирует ? Если да, см. Ответ @ sbi. Но вам действительно нужно правильно сформулировать свой вопрос. Какая у вас ошибка компиляции? Или он не работает во время выполнения? Однако в данном случае я считаю, что вы имеете в виду ошибку компиляции.