Получение значения std:: list <>:: iterator для указателя?
Как я могу выполнить цикл через stl:: List и сохранить значение одного из объектов, которые будут использоваться позже в функции?
Particle *closestParticle;
for(list<Particle>::iterator p1 = mParticles.begin(); p1 != mParticles.end(); ++p1 )
{
// Extra stuff removed
closestParticle = p1; // fails to compile (edit from comments)
}
Ответы
Ответ 1
Либо
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;
}
Они сортируются по возрастанию личных предпочтений. :)
Ответ 2
Для a list
единственным способом аннулирования итератора является erase
it. Поэтому я подозреваю, что вы вызываете list.erase(p1)
в какой-то момент цикла. Вам нужно сделать копию итератора, переместить p1
назад, а затем удалить копию.
EDIT: О, подождите, вы имели в виду, что это не компилировать? Если да, см. Ответ @sbi. Но вам действительно нужно правильно рассказать о своем вопросе. Какова ваша ошибка компиляции? Или это не работает во время выполнения? В этом случае, однако, я считаю, что вы имеете в виду ошибку компиляции.
Ответ 3
Я не эксперт по STL, но я считаю, что причина, по которой он не скомпилирован, заключается в том, что итератор является объектом, который указывает на другой объект. Другими словами, итератор является обобщением указателя. Поэтому, чтобы делать то, что вы хотели бы с минимальными изменениями в вашем коде, вам сначала нужно снять ссылку на итератор, чтобы получить значение, которое оно содержит. Затем вы использовали "&". чтобы получить его адрес и затем назначить этот адрес вашей переменной указателя. Вот почему ptr = & * it; работает.