Incrementare i puntatori è C ++ idiomatico, perché la semantica dei puntatori riflette un aspetto fondamentale della filosofia progettuale alla base della libreria standard C ++ (basata sullo STL di Alexander Stepanov )
Il concetto importante qui è che l'STL è progettato attorno a contenitori, algoritmi e iteratori. I puntatori sono semplicemente iteratori .
Ovviamente, la capacità di incrementare (o aggiungere / sottrarre) i puntatori risale a C. Molti algoritmi di manipolazione della stringa C possono essere scritti semplicemente usando l'aritmetica del puntatore. Considera il seguente codice:
char string1[4] = "abc";
char string2[4];
char* src = string1;
char* dest = string2;
while ((*dest++ = *src++));
Questo codice utilizza l'aritmetica del puntatore per copiare una stringa C terminata con null. Il ciclo termina automaticamente quando incontra il null.
Con C ++, la semantica del puntatore è generalizzata al concetto di iteratori . La maggior parte dei contenitori C ++ standard fornisce iteratori, a cui è possibile accedere tramite le funzioni begin
e end
member. Gli iteratori si comportano come puntatori, in quanto possono essere incrementati, dereferenziati e talvolta decrementati o avanzati.
Per iterare su un std::string
, dovremmo dire:
std::string s = "abcdef";
std::string::iterator it = s.begin();
for (; it != s.end(); ++it) std::cout << *it;
Aumentiamo l'iteratore proprio come vorremmo incrementare un puntatore a una semplice stringa a C. Il motivo per cui questo concetto è potente è perché è possibile utilizzare modelli per scrivere funzioni che funzioneranno per qualsiasi tipo di iteratore che soddisfi i requisiti di concetto necessari. E questo è il potere dell'STL:
std::string s1 = "abcdef";
std::vector<char> buf;
std::copy(s1.begin(), s1.end(), std::back_inserter(buf));
Questo codice copia una stringa in un vettore. La copy
funzione è un modello che funzionerà con qualsiasi iteratore che supporti l'incremento (che include puntatori semplici). Potremmo usare la stessa copy
funzione su una semplice stringa C:
const char* s1 = "abcdef";
std::vector<char> buf;
std::copy(s1, s1 + std::strlen(s1), std::back_inserter(buf));
Potremmo utilizzare copy
su un std::map
o un std::set
o qualsiasi contenitore personalizzato che supporti gli iteratori.
Si noti che i puntatori sono un tipo specifico di iteratore: iteratore ad accesso casuale , il che significa che supportano l'incremento, il decremento e l'avanzamento con l' operatore +
e -
. Altri tipi di iteratori supportano solo un sottoinsieme di semantica del puntatore: un iteratore bidirezionale supporta almeno l'incremento e il decremento; un iteratore in avanti supporta almeno l'incremento. (Tutti i tipi di iteratore supportano il dereferenziamento.) La copy
funzione richiede un iteratore che supporti almeno l'incremento.
Puoi leggere i diversi concetti di iteratore qui .
Pertanto, incrementare i puntatori è un modo C ++ idiomatico per iterare su un array C o accedere a elementi / offset in un array C.