12
votes

Pourquoi foreach itérant avec une référence de const?

J'essaie de faire ce qui suit:

QList<QString> a;
foreach(QString& s, a)
{
    s += "s";
}


0 commentaires

5 Réponses :


2
votes

Je crois que le Foraach de Qt adopte une copie temporaire de la collection originale avant de l'itération, il n'aurait donc aucun sens d'avoir une référence non constituée comme modification de la copie temporaire qu'elle n'aurait aucun effet.


0 commentaires

21
votes

Comme expliqué sur le Documentation de conteneurs génériques QT :

QT prend automatiquement une copie du conteneur lorsqu'elle entre dans une boucle foreach. Si vous modifiez le conteneur pendant que vous êtes itération, cela n'affectera pas la boucle. (Si vous ne modifiez pas le conteneur, la copie a toujours lieu, mais grâce à la copie implicite de copier un conteneur est très rapide.) De même, déclarant que la variable est une référence non constituée, afin de modifier l'élément actuel dans La liste ne fonctionnera pas non plus. P> blockQuote>

Il en fait une copie, car vous voudrez peut-être supprimer un élément de la liste ou ajouter des éléments pendant que vous bouclez par exemple. L'inconvénient est que votre cas d'utilisation ne fonctionnera pas. Vous devrez goûter sur la liste à la place: P>

for (QList<QString>::iterator i = a.begin(); i != a.end(); ++i) { 
  (*i) += "s";
} 


1 commentaires

Nitpick mineur: Je préfère: pour (qlist :: itérateur i = a.begin (), find = a.end (); i! = Fin; ...)



2
votes

Peut-être pour votre cas:

namespace bl = boost::lambda;
std::for_each(a.begin(),a.end(),bl::_1 += "s");


0 commentaires

5
votes

ou vous pouvez utiliser

QList<QString> a;
BOOST_FOREACH(QString& s, a)
{
   s += "s";
}


0 commentaires

2
votes

avec C ++ 11, qt encourage maintenant cette standard pour la syntaxe au lieu de qt foreach : xxx


0 commentaires