Quelle est la différence entre ces deux concernant la mise en œuvre au sein de STL. Quelle est la différence en matière de performance? J'imagine que lorsque nous parcourons le vecteur en "lecture seule", nous préférons const_iterator
, droite?
Je vous remercie.
Il n'y a pas de différence de performance.
UNE const_iterator
est un itérateur qui pointe vers la valeur const (comme un const T*
pointeur); 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
- exactitude .
Lorsque vous avez une référence const au conteneur, vous ne pouvez obtenir qu'un const_iterator
.
Edité: J'ai mentionné “Le const_iterator
renvoie des pointeurs constants ", ce qui n’est pas exact, merci à Brandon de l’avoir signalé.
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
utilisez COW.)
Performance sage, il n'y a pas de différence. Le seul but d'avoir const_iterator
sur iterator
consiste à gérer l’accessibilité du conteneur sur lequel l’itérateur respectif est exécuté. 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 utiliserions l'itérateur:
for( std::vector<int>::iterator it = integers.begin() ; it != integers.end() ; ++it )
{*it = 4; std::cout << *it << std::endl; }
Si nous ne lisions que les membres du conteneur integers
, vous voudrez peut-être utiliser const_iterator qui ne permet pas d’écrire ou de modifier les membres du conteneur.
for( std::vector<int>::const_iterator it = integers.begin() ; it != integers.end() ; ++it )
{ cout << *it << endl; }
NOTE: si vous essayez de modifier le contenu en utilisant * it dans le second cas, vous obtiendrez une erreur car elle est en lecture seule.
si vous avez une liste puis des déclarations 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-à-dire que vous pouvez utiliser "cit" pour lire le contenu et non pour mettre à jour les éléments.
*it=*it+1;//returns no error
*cit=*cit+1;//this will return error