web-dev-qa-db-fra.com

Quelle est la difference entre const_iterator et iterator?

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.

119
user658266

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

118
ysdx

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.

37
AbhimanyuAryan

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
6
Seenivasan