Итераторы смоделированы так, чтобы действовать как указатели. Они имеют один и тот же тип перегруженных операторов: разыменование и инкремент по крайней мере (некоторые также имеют декремент, произвольный доступ и т. Д.).
Самый продвинутый интерфейс итератора - это произвольный доступ, который функционирует точно так же, как необработанный указатель (по замыслу).
Таким образом, все (необработанные) указатели являются в основном итераторами с произвольным доступом в массив (смежный) в стиле C. Посмотрите на следующее, чтобы визуализировать начало / конец итераторов для массива в стиле C:
int vals[] = { 0, 1, 2, 3, 4 };
int *begin = vals;
int *end = vals + 5;
v vals[]
0 1 2 3 4 ...
^ begin ^ end (1 past the end of array)
vals[2] == begin[2]
vals[4] == begin[4]
etc.
Таким образом, в основном, вы просто рассматриваете начальный итератор как начало массива, и вы просто не разыменовываете нигде ни перед начальным итератором, ни перед конечным итератором или после него, поскольку стандартное соглашение C ++ диктует, что конечный итератор равен 1 после конца диапазона.
Вот пример использования указателей, таких как итераторы:
void print(int *begin, int *end)
{
// for each element in the range (starting at begin, up to but not including end)
for (; begin != end; ++begin)
{
// print the element
std::cout << *begin << '\n';
}
}
int main()
{
// declare a C-style array
int arr[] = { 10, 5, 2, 6, 20 };
// for the sake of example, print only the middle 3 elements
// begin = arr + 1
// end = arr + 4
print(arr + 1, arr + 4);
return 0;
}