Quelle est la différence entre const_iterator et iterator?

Quelle est la différence entre ces deux en ce qui concerne la mise en œuvre dans STL. Quelle est la différence en matière de performance? Je suppose que lorsque nous parcourons le vecteur “read only wise”, nous préférons const_iterator , non?

Je vous remercie.

Il n’y a pas de différence de performance.

Un const_iterator est un iterator qui pointe vers 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 -correctness .

Lorsque vous avez une référence const au conteneur, vous ne pouvez obtenir qu’un const_iterator .

Édité: J’ai mentionné “Le const_iterator renvoie des pointeurs constants”, ce qui n’est pas exact, grâce à Brandon.

Edit: Pour les objects COW, obtenir un iterator non const (ou le déréférencer) déclenchera probablement la copie. (Certaines implémentations obsolètes et maintenant interdites de std::ssortingng utilisent COW.)

Performance sage, il n’y a pas de différence. Le seul but de const_iterator over iterator est de gérer l’accessibilité du conteneur sur lequel s’exécute l’iterator respectif. Vous pouvez le comprendre plus clairement avec un exemple:

 std::vector integers{ 3, 4, 56, 6, 778 }; 

Si nous devions lire et écrire les membres d’un conteneur, nous utiliserons l’iterator:

 for( std::vector::iterator it = integers.begin() ; it != integers.end() ; ++it ) {*it = 4; std::cout << *it << std::endl; } 

Si nous devions seulement lire les membres des integers conteneur, vous pourriez utiliser const_iterator qui ne permet pas d’écrire ou de modifier les membres du conteneur.

 for( std::vector::const_iterator it = integers.begin() ; it != integers.end() ; ++it ) { cout << *it << endl; } 

REMARQUE: si vous essayez de modifier le contenu en utilisant * it dans un second cas, vous obtiendrez une erreur car sa lecture seule.

si vous avez une liste a puis les déclarations suivantes

 list::iterator it; // declare an iterator list::const_iterator cit; // declare an const iterator it=a.begin(); cit=a.begin(); 

vous pouvez changer 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