Получение значения 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; работает.