Incrementar ponteiros é C ++ idiomático, porque a semântica de ponteiros reflete um aspecto fundamental da filosofia de design por trás da biblioteca padrão C ++ (baseada na STL de Alexander Stepanov )
O conceito importante aqui é que o STL é projetado em torno de contêineres, algoritmos e iteradores. Ponteiros são simplesmente iteradores .
Obviamente, a capacidade de incrementar (ou adicionar / subtrair) ponteiros remonta a C. Muitos algoritmos de manipulação de cordas C podem ser escritos simplesmente usando a aritmética dos ponteiros. Considere o seguinte código:
char string1[4] = "abc";
char string2[4];
char* src = string1;
char* dest = string2;
while ((*dest++ = *src++));
Esse código usa a aritmética do ponteiro para copiar uma cadeia C terminada em nulo. O loop termina automaticamente quando encontra o nulo.
Com o C ++, a semântica do ponteiro é generalizada para o conceito de iteradores . A maioria dos contêineres C ++ padrão fornece iteradores, que podem ser acessados através das funções-membro begin
e end
. Os iteradores se comportam como ponteiros, pois podem ser incrementados, desreferenciados e, às vezes, decrementados ou avançados.
Para iterar sobre um std::string
, diríamos:
std::string s = "abcdef";
std::string::iterator it = s.begin();
for (; it != s.end(); ++it) std::cout << *it;
Nós incrementamos o iterador da mesma forma que incrementamos um ponteiro para uma string C simples. A razão pela qual esse conceito é poderoso é porque você pode usar modelos para escrever funções que funcionarão para qualquer tipo de iterador que atenda aos requisitos de conceito necessários. E este é o poder do STL:
std::string s1 = "abcdef";
std::vector<char> buf;
std::copy(s1.begin(), s1.end(), std::back_inserter(buf));
Este código copia uma string em um vetor. A copy
função é um modelo que funcionará com qualquer iterador que ofereça suporte ao incremento (que inclui ponteiros simples). Poderíamos usar a mesma copy
função em uma string C simples:
const char* s1 = "abcdef";
std::vector<char> buf;
std::copy(s1, s1 + std::strlen(s1), std::back_inserter(buf));
Poderíamos usar copy
em um std::map
ou um std::set
ou qualquer contêiner personalizado que suporte iteradores.
Observe que os ponteiros são um tipo específico de iterador: iterador de acesso aleatório , o que significa que eles oferecem suporte para incrementar, decrementar e avançar com o operador +
e -
. Outros tipos de iteradores suportam apenas um subconjunto de semânticas de ponteiros: um iterador bidirecional suporta pelo menos incrementos e decrementos; um iterador direto suporta pelo menos incrementos. (Todos os tipos de iteradores suportam a desreferenciação.) A copy
função requer um iterador que suporte pelo menos o incremento.
Você pode ler sobre diferentes conceitos de iteradores aqui .
Portanto, incrementar ponteiros é uma maneira idiomática do C ++ para iterar em um array C ou acessar elementos / deslocamentos em um array C.