Pointer yang bertambah adalah idiomatik C ++, karena pointer semantik mencerminkan aspek mendasar dari filosofi desain di belakang pustaka standar C ++ (berdasarkan STL Alexander Stepanov )
Konsep penting di sini, adalah bahwa STL dirancang di sekitar wadah, algoritma, dan iterator. Pointer hanyalah iterator .
Tentu saja, kemampuan untuk menambah (atau menambah / mengurangi) pointer kembali ke C. Banyak algoritma manipulasi C-string dapat ditulis hanya dengan menggunakan aritmatika pointer. Pertimbangkan kode berikut:
char string1[4] = "abc";
char string2[4];
char* src = string1;
char* dest = string2;
while ((*dest++ = *src++));
Kode ini menggunakan pointer aritmatika untuk menyalin string-null yang diakhiri. Loop secara otomatis berakhir ketika bertemu dengan nol.
Dengan C ++, pointer semantik digeneralisasikan ke konsep iterators . Paling standar C ++ wadah memberikan iterator, yang dapat diakses melalui begin
dan end
anggota fungsi. Iterator berperilaku seperti pointer, dalam arti mereka dapat ditingkatkan, dikurangi, dan kadang-kadang dikurangi atau maju.
Untuk beralih lebih dari satu std::string
, kita akan mengatakan:
std::string s = "abcdef";
std::string::iterator it = s.begin();
for (; it != s.end(); ++it) std::cout << *it;
Kami menambah iterator seperti halnya kami akan menambah pointer ke string C-plain. Alasan konsep ini sangat kuat adalah karena Anda dapat menggunakan templat untuk menulis fungsi yang akan bekerja untuk semua jenis iterator yang memenuhi persyaratan konsep yang diperlukan. Dan ini adalah kekuatan STL:
std::string s1 = "abcdef";
std::vector<char> buf;
std::copy(s1.begin(), s1.end(), std::back_inserter(buf));
Kode ini menyalin string ke dalam vektor. The copy
fungsi template yang akan bekerja dengan setiap iterator yang mendukung incrementing (termasuk pointer polos). Kita bisa menggunakan copy
fungsi yang sama pada string C-string:
const char* s1 = "abcdef";
std::vector<char> buf;
std::copy(s1, s1 + std::strlen(s1), std::back_inserter(buf));
Kita dapat menggunakan copy
pada std::map
atau std::set
atau wadah kustom apa pun yang mendukung iterator.
Perhatikan bahwa pointer jenis tertentu dari iterator: random akses iterator , yang berarti mereka mendukung incrementing, decrementing, dan maju dengan +
dan -
operator. Jenis iterator lain hanya mendukung subset dari semantik pointer: iterator dua arah mendukung setidaknya menambah dan mengurangi; a maju iterator mendukung setidaknya incrementing. (Semua jenis iterator mendukung dereferencing.) copy
Fungsi ini membutuhkan iterator yang setidaknya mendukung penambahan.
Anda dapat membaca tentang berbagai konsep iterator di sini .
Jadi, incrementing pointer adalah cara C ++ idiomatis untuk beralih pada C-array, atau mengakses elemen / offset dalam C-array.