Получение значения std :: list <> :: iterator для указателя? - PullRequest
16 голосов
/ 02 мая 2010

Как сделать цикл через 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)
     }

Ответы [ 3 ]

53 голосов
/ 02 мая 2010

Либо

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

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

1 голос
/ 02 мая 2010

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

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

0 голосов
/ 03 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...