Je vais prendre un angle différent ici. const
et const_iterator
moyenne de choses complètement différentes.
const
appliqué à un itérateur qui signifie que vous ne pouvez pas modifier l'itérateur lui-même, mais vous pouvez modifier l'élément de points, un peu comme un pointeur déclaré comme int* const
. const_iterator
signifie que vous ne pouvez pas modifier l'élément de points, mais vous pouvez toujours modifier l'itérateur lui-même (ie. vous pouvez incrémenter et décrémenter) un peu comme un pointeur déclaré comme const int*
.
std::vector<int> container = {1, 2, 3, 4, 5};
const std::vector<int> const_container = {6, 7, 8, 9, 0};
auto it1 = container.begin();
const auto it2 = container.begin();
auto it3 = const_container.begin();
const auto it4 = const_container.begin();
*it1 = 10; //legal
*it2 = 11; //legal
*it3 = 12; //illegal, won't compile
*it4 = 13; //illegal, won't compile
it1++; //legal
it2++; //illegal, won't compile
it3++; //legal
it4++; //illegal, won't compile
Comme vous pouvez le voir, la possibilité de modifier l'élément de l'itérateur points dépend uniquement de savoir si c'est un iterator
ou const_iterator
, et la possibilité de modifier l'itérateur lui-même ne dépend que de savoir si la déclaration de la variable pour l'itérateur a un const
de qualification.
Edit: je viens de réaliser que c'est une série pour les et il n'est donc pas itérateurs à jouer ici à tous (du moins pas explicitement). x
n'est pas un itérateur et est en fait une référence directe à un élément du conteneur. Mais vous avez la bonne idée, il sera déduit pour avoir l' const
qualificatif peu importe si on est explicitement écrit.