web-dev-qa-db-fra.com

Obtenir la valeur de STD :: Liste <> :: Itérateur au pointeur?

Comment puis-je boucler à travers une liste de stl :: liste et stocker la valeur de l'un des objets à utiliser ultérieurement dans la fonction?

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

Soit

Particle *closestParticle;
for(list<Particle>::iterator it=mParticles.begin(); it!=mParticles.end(); ++it)
    {
      // Extra stuff removed
            closestParticle = &*it;
    }

ou

list<Particle>::iterator closestParticle;
for(list<Particle>::iterator it=mParticles.begin(); it!=mParticles.end(); ++it )
    {
      // Extra stuff removed
            closestParticle = it;
    }

ou

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

ou

template< typename It > 
inline It findClosestParticle(It begin, It end)
{
    while(begin != end )
        {
          // Extra stuff removed
               return begin;
          ++begin;
        }
    return end;
}

Ceux-ci sont triés dans une préférence personnelle croissante. :)

56
sbi

Pour un list, le seul moyen d'invalider un itérateur est de erase IT. Je suppose donc que vous appelez list.erase(p1) à un moment donné de la boucle. Vous devez faire une copie de l'itérateur, déplacer p1 en arrière, puis effacez la copie.

EDIT: OH Attendez, avez-vous voulu dire que cela ne compiler? Si oui, voir la réponse de @ SBI. Mais vous avez vraiment besoin de vous donner votre question de manière directe. Quelle est votre erreur de compilation? Ou échoue-t-il au temps d'exécution? Dans ce cas, cependant, je pense que vous voulez dire une erreur de compilation.

1
rlbond

Je ne suis pas un expert sur la STL, mais je crois que la raison pour laquelle il ne compile pas est parce qu'un itérateur est un objet qui pointe vers un autre objet. En d'autres termes, un itérateur est une généralisation d'un pointeur. Donc, pour faire ce que vous voudriez avec des modifications minimales à votre code, vous devez d'abord vous référencer à désaffecter l'itérateur pour obtenir à la valeur qu'il contient. Vous utiliseriez ensuite le "&" pour obtenir son adresse et affecterait ensuite cette adresse à votre variable de pointeur. C'est pourquoi pTR = & * IT; travaux.

0
Carl