quelle est la différence entre const itérateur et itérateur? [dupliquer]
Cette question a déjà une réponse ici:
Quelle est la différence entre ces deux en ce qui concerne l'implémentation dans STL.
Quelle est la différence en ce qui concerne les performances?
Je suppose que lorsque nous traversons le vecteur en "lecture seule sage", nous préférons const_iterator
, droit?
Merci.
3 réponses
Il n'y a pas de différence de performances.
Un const_iterator
est un itérateur qui pointe vers la valeur const (comme un pointeur const T*
); le déréférencement renvoie une référence à une valeur constante (const T&
) et empêche la modification de la valeur référencée: il applique const
-Correction .
Lorsque vous avez une référence const au conteneur, vous ne pouvez obtenir qu'un const_iterator
.
Edited: j'ai mentionné "le const_iterator
renvoie des pointeurs constants" qui n'est pas précis, grâce à Brandon pour le pointant à l'extérieur.
Edit: pour les objets COW, obtenir un itérateur non const (ou le déréférencer) déclenchera probablement la copie. (Certaines implémentations obsolètes et maintenant interdites de std::string
utilisent COW.)
Performance sage il n'y a pas de différence. Le seul but d'avoir const_iterator
sur iterator
est de gérer la accessesibility du conteneur sur lequel la itérateur s'exécute. Vous pouvez le comprendre plus clairement avec un exemple:
std::vector<int> integers{ 3, 4, 56, 6, 778 };
Si nous devions lire et écrire les membres d'un conteneur, nous utiliserons iterator:
for( std::vector<int>::iterator it = integers.begin() ; it != integers.end() ; ++it )
{*it = 4; std::cout << *it << std::endl; }
Si nous ne lisons que les membres du conteneur integers
vous voudrez peut-être utiliser const_iterator qui ne permet pas d'écrire ou de modifier les membres de conteneur.
for( std::vector<int>::const_iterator it = integers.begin() ; it != integers.end() ; ++it )
{ cout << *it << endl; }
Remarque: Si vous essayez de modifier le contenu en utilisant * it dans le second cas, vous obtiendrez une erreur car il est en lecture seule.
Si vous avez une liste a, puis les instructions suivantes
list<int>::iterator it; // declare an iterator
list<int>::const_iterator cit; // declare an const iterator
it=a.begin();
cit=a.begin();
Vous pouvez modifier le contenu de l'élément dans la liste en utilisant " it "mais pas" cit", c'est que vous pouvez utiliser "cit" pour lire le contenu pas pour mettre à jour les éléments.
*it=*it+1;//returns no error
*cit=*cit+1;//this will return error