El aumento de punteros es idiomático C ++, porque la semántica de puntero refleja un aspecto fundamental de la filosofía de diseño detrás de la biblioteca estándar C ++ (basada en STL de Alexander Stepanov )
El concepto importante aquí es que el STL está diseñado alrededor de contenedores, algoritmos e iteradores. Los punteros son simplemente iteradores .
Por supuesto, la capacidad de incrementar (o sumar / restar) punteros se remonta a C. Se pueden escribir muchos algoritmos de manipulación de cadenas en C simplemente usando la aritmética de punteros. Considere el siguiente código:
char string1[4] = "abc";
char string2[4];
char* src = string1;
char* dest = string2;
while ((*dest++ = *src++));
Este código usa aritmética de puntero para copiar una cadena en C terminada en nulo. El ciclo termina automáticamente cuando encuentra el nulo.
Con C ++, la semántica de puntero se generaliza al concepto de iteradores . La mayoría de los contenedores estándar de C ++ proporcionan iteradores, a los que se puede acceder a través de las funciones begin
y end
miembro. Los iteradores se comportan como punteros, en el sentido de que pueden incrementarse, desreferenciarse y, a veces, disminuirse o avanzarse.
Para iterar sobre un std::string
, diríamos:
std::string s = "abcdef";
std::string::iterator it = s.begin();
for (; it != s.end(); ++it) std::cout << *it;
Incrementamos el iterador al igual que incrementaríamos un puntero a una cadena en C simple. La razón por la que este concepto es poderoso es porque puede usar plantillas para escribir funciones que funcionarán para cualquier tipo de iterador que cumpla con los requisitos de concepto necesarios. Y este es el poder de la STL:
std::string s1 = "abcdef";
std::vector<char> buf;
std::copy(s1.begin(), s1.end(), std::back_inserter(buf));
Este código copia una cadena en un vector. La copy
función es una plantilla que funcionará con cualquier iterador que admita el incremento (que incluye punteros simples). Podríamos usar la misma copy
función en una cadena en C simple:
const char* s1 = "abcdef";
std::vector<char> buf;
std::copy(s1, s1 + std::strlen(s1), std::back_inserter(buf));
Podríamos usar copy
en uno std::map
o uno std::set
o cualquier contenedor personalizado que admita iteradores.
Tenga en cuenta que los punteros son un tipo específico de iterador: iterador de acceso aleatorio , lo que significa que admiten el incremento, la disminución y el avance con el operador +
y -
. Otros tipos de iteradores solo admiten un subconjunto de semántica de puntero: un iterador bidireccional admite al menos incrementos y decrementos; un iterador directo admite al menos incrementos. (Todos los tipos de iteradores admiten la desreferenciación). La copy
función requiere un iterador que al menos admita el incremento.
Puede leer sobre diferentes conceptos de iterador aquí .
Por lo tanto, incrementar los punteros es una forma idiomática de C ++ de iterar sobre una matriz C, o acceder a elementos / compensaciones en una matriz C.