176 votes

const et nonconst STL Itérateurs

Quelle est la différence entre un ::const_iterator et ::iterator et où voulez-vous utiliser l'un plutôt que l'autre?

159voto

Dominic Rodger Points 44489

const_iterators ne vous permettra pas de modifier les valeurs de point de, régulières iterators ne.

Comme avec toutes les choses en C++, toujours préférer const, sauf s'il y a une bonne raison d'utiliser les itérateurs (c'est à dire que vous souhaitez utiliser le fait qu'ils ne sont pas const de variation de la pointe-de valeur).

51voto

jalf Points 142628

Ils devraient assez bien d'être auto-explicatif. Si l'itérateur qui pointe vers un élément de type T, alors const_iterator points à un élément de type "const T'.

C'est en gros l'équivalent du type pointeur:

T* // A non-const iterator to a non-const element. Corresponds to std::vector<T>::iterator
T* const // A const iterator to a non-const element. Corresponds to const std::vector<T>::iterator
const T* // A non-const iterator to a const element. Corresponds to std::vector<T>::const_iterator

Const itérateur qui pointe toujours vers le même élément, de sorte que l'itérateur lui-même est const. Mais l'élément de points pour ne pas être const, de sorte que l'élément de points à peut être changé. Un const_iterator est un itérateur qui pointe vers un const élément, alors que l'itérateur lui-même peut être mis à jour (incrémenté ou décrémenté, par exemple), l'élément de points à ne peut pas être changé.

8voto

Magnus Andermo Points 195

Unfortunaty, un grand nombre de méthodes pour les conteneurs STL prend les itérateurs au lieu de const_iterators en tant que paramètres. Donc, si vous avez un const_iterator, vous ne pouvez pas dire "insérer un élément avant de l'élément que cet itérateur points" (en disant une telle chose n'est pas conceptuellement un const violation, à mon avis). Si vous voulez faire de toute façon, vous devez la convertir en une non-const itérateur en utilisant std::advance() ou boost::next(). Par exemple. boost::next(conteneur.begin(), std::distance(récipient.begin(), the_const_iterator_we_want_to_unconst)). Si le conteneur est un std::list, puis le temps d'exécution de cet appel sera O(n).

Donc, la règle universelle pour ajouter const où il est "logique" pour le faire, est moins universel quand il s'agit de conteneurs STL.

Cependant, boost conteneurs prendre const_iterators (eg. boost::unordered_map::erase()). Ainsi, lorsque vous utilisez le boost conteneurs vous pouvez être "const agressive". En passant, quelqu'un sait si ou lorsque les conteneurs STL sera corrigé?

7voto

Naveen Points 37095

Utilisation const_iterator chaque fois que vous le pouvez, utilisez itérateur lorsque vous n'avez pas d'autre choix.

0voto

Trey Jackson Points 49816

(comme d'autres l'ont dit) const_iterator ne vous permet pas de modifier les éléments dont il points de, ce qui est utile à l'intérieur de const méthodes de la classe. Il vous permet également d'exprimer votre intention.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X