¿Cómo se relacionan los iteradores y los indicadores?

El código con iteradores se parece mucho al código con punteros. Los iteradores son de algún tipo oscuro (como std::vector::iterator por ejemplo).

Lo que no entiendo es cómo los iteradores y el puntero están relacionados entre sí: ¿es un iterador un envoltorio alrededor de un puntero con operaciones sobrecargadas para avanzar a elementos adyacentes o es algo más?

Iteradores son una generalización de punteros.

Un iterador (según las variantes) debe implementar * y ++

Entonces, un puntero ES un iterador. Pero no necesariamente al revés.

Si desea iterar sobre una estructura compleja (un árbol, un gráfico …), el iterador será mucho más que un puntero, y no hace referencia a ningún lugar real en el ariete.

Los Iteradores son objetos que sobrecargan ciertos operadores, por lo que el uso parecería que eran punteros. Eso está dentro de las capacidades de una categoría de iterador dada. Los iteradores de acceso aleatorio se parecen completamente a punteros, otros tipos de iteradores no proporcionan algunas operaciones (por ejemplo, la list::iterator que es bidireccional no tiene operator += entre muchos otros que requerirían acceso aleatorio).

En cuanto a los “nombres oscuros”, no es completamente impensable usar un puntero simple para un iterador:

  template  class MyContainer { ... typedef T* iterator; } MyContainer::iterator it; //the type is really int* 

Conceptualmente, sí, pero no necesitan ser punteros. Sus funciones internas y capacidades dependerán de la estructura de datos que “envuelvan”.

Es por eso que hay diferentes “clases” de iteradores . Ej. Unidireccional, Bidireccional, Acceso Aleatorio, etc.

Algunos son capaces de múltiples clases.

Por ejemplo, si la estructura interna es un árbol rojo-negro o una lista vinculada, los iteradores pueden ser bidireccionales, pero no acceso aleatorio. Si envuelven un vector (implementado como una matriz), tendrá acceso aleatorio y bidireccional.

Un iterador es solo un concepto que proporciona la interfaz requerida para los iteradores: estos son diferentes para los diferentes tipos de iteradores y se especifican en la sección 24.1 del estándar de C ++ (Requisitos del iterador).

La forma en que se implementan los iteradores depende de lo que iteran: para los vectores suelen ser un contenedor alrededor de un solo puntero a una matriz (en versiones de lanzamiento de todos modos), para los contenedores más complejos tienen una implementación más complicada. Para intervalos abiertos, contendrán el estado de cualquier algoritmo que esté siendo usado para generar los elementos.

Tenga en cuenta que un puntero a un elemento en una matriz cumple los requisitos de un iterador de acceso aleatorio, por lo que hasta cierto punto son intercambiables.