Для большей наглядности рассмотрим похожий код, но вместо вектора используется массив.
#include <iostream>
#include <iterator>
int main()
{
int a[] = { 1, 2, 3 };
for ( auto p = std::begin( a ); p != std::end( a ); p++ )
{
std::cout << "The address of p is " << &p
<< ", its value is " << p
<< ", and the pointed value is " << *p
<< '\n';
}
return 0;
}
Вывод программы может выглядеть как
The address of p is 0x7ffcaf6a6830, its value is 0x7ffcaf6a683c, and the pointed value is 1
The address of p is 0x7ffcaf6a6830, its value is 0x7ffcaf6a6840, and the pointed value is 2
The address of p is 0x7ffcaf6a6830, its value is 0x7ffcaf6a6844, and the pointed value is 3
Эта часть выводимые строки
The address of p is 0x7ffcaf6a6830
не изменяются, поскольку это адрес самой локальной переменной (указателя) p.
Эта часть строк
its value is 0x7ffcaf6a683c
изменяется, потому что в пределах l oop значение указателя изменяется
for ( auto p = std::begin( a ); p != std::end( a ); p++ )
^^^^
На каждой итерации указатель указывает на следующий элемент массива.
Эта часть строки
and the pointed value is 1
также изменяются, поскольку выводится указанное значение из-за разыменования указателя.
То же самое происходит с итератором вектора.