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.

107
demandé sur Guy Avraham 2011-03-18 03:45:11

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

108
répondu ysdx 2017-05-14 20:27:01

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.

34
répondu AbhimanyuAryan 2016-01-23 19:25:22

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
5
répondu Seenivasan 2017-03-01 15:20:22