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)
}
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. :)
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.
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.