Получение значения станд.:: список <>:: итератор к указателю?

Как может я циклично выполняться через 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)
     }
17
задан Onedayitwillmake 2 May 2010 в 19:49
поделиться

3 ответа

Либо

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;
}

Они отсортированы по возрастанию личных предпочтений. :)

55
ответ дан 30 November 2019 в 10:24
поделиться

Я не эксперт по STL, но считаю, что причина его неудачной компиляции в том, что итератор - это объект, указывающий на другой объект. Другими словами, итератор - это обобщение указателя. Итак, чтобы сделать то, что вы хотите, с минимальными изменениями в вашем коде, вам сначала нужно отменить ссылку на итератор, чтобы получить значение, которое он содержит. Затем вы использовали бы '&', чтобы получить его адрес, а затем назначили бы этот адрес своей переменной-указателю. Вот почему ptr = & * it; работает.

0
ответ дан 30 November 2019 в 10:24
поделиться

Для списка единственный способ сделать итератор недействительным - это стереть его. Я подозреваю, что вы вызываете list.erase (p1) в какой-то момент цикла. Вам нужно сделать копию итератора, переместить p1 назад, а затем стереть копию.

РЕДАКТИРОВАТЬ: Ой, подождите, вы имели в виду, что не компилирует ? Если да, см. Ответ @ sbi. Но вам действительно нужно правильно сформулировать свой вопрос. Какая у вас ошибка компиляции? Или он не работает во время выполнения? Однако в данном случае я считаю, что вы имеете в виду ошибку компиляции.

1
ответ дан 30 November 2019 в 10:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: