İşaretçi semantik (Alexander Stepanov en kapalı dayalı C ++ standart kitaplığının arkasında tasarım felsefesinin temel bir yönünü yansıtmaktadır çünkü işaretçileri artırma, C ++ biçimini olduğu STL )
Buradaki önemli kavram, STL'nin kaplar, algoritmalar ve yineleyiciler etrafında tasarlanmasıdır. İşaretçiler basitçe yineleyicilerdir .
Elbette, işaretçileri artırma (ya da toplama / çıkarma) işaretçisi C'ye geri döner. Bir çok C-string manipülasyon algoritması sadece pointer aritmetiği kullanılarak yazılabilir. Aşağıdaki kodu göz önünde bulundurun:
char string1[4] = "abc";
char string2[4];
char* src = string1;
char* dest = string2;
while ((*dest++ = *src++));
Bu kod, boş sonlandırılmış bir C dizesini kopyalamak için işaretçi aritmetik kullanır. Döngü, boş değerle karşılaştığında otomatik olarak sona erer.
C ++ ile işaretçi anlambilimi, yineleyiciler kavramına genelleştirilir . Çoğu standart C ++ konteyner üzerinden erişilebilir yineleyicileri sağlamak begin
ve end
eleman fonksiyonlarının. Tekrarlayıcılar işaretçiler gibi davranır, böylece artırılabilir, değişkenleştirilebilir ve bazen azaltılabilir veya ilerletilebilir.
Bir yineleme yapmak için şunu std::string
söyleriz:
std::string s = "abcdef";
std::string::iterator it = s.begin();
for (; it != s.end(); ++it) std::cout << *it;
Yineleyiciyi, tıpkı bir göstergeyi düz bir C-string'e arttırdığımız gibi yükseltiriz. Bu kavramın güçlü olmasının nedeni , gerekli kavram gereksinimlerini karşılayan herhangi bir yineleyici için çalışacak işlevleri yazmak için şablonları kullanabilmenizdir . Ve bu STL’nin gücü:
std::string s1 = "abcdef";
std::vector<char> buf;
std::copy(s1.begin(), s1.end(), std::back_inserter(buf));
Bu kod bir dizgiyi vektöre kopyalar. copy
Fonksiyonu ile çalışacak bir şablon herhangi (düz işaretçileri içerir) destekler artan bu yineleyici. Aynı copy
işlevi düz bir C-string'de kullanabiliriz:
const char* s1 = "abcdef";
std::vector<char> buf;
std::copy(s1, s1 + std::strlen(s1), std::back_inserter(buf));
Biz kullanabilirsiniz copy
, bir de std::map
ya bir std::set
ya herhangi özel konteyner destekleri Yineleyicilerin söyledi.
İşaretçilerin belirli bir yineleyici türü olduğuna dikkat edin: rasgele erişim yineleyicisi , bunlar artırıcı, azaltmalı ve +
ve -
işleci ile ilerletmeyi destekler . Diğer yineleyici türleri yalnızca işaretçi anlambiliminin bir alt kümesini destekler : çift yönlü yineleyici en azından artırma ve azaltma işlemlerini destekler; bir ileri yineleyici en azından artışı destekler. (Tüm yineleyici türleri kayıttan kaldırmayı destekler.) copy
İşlev, en azından artışı destekleyen bir yineleyici gerektirir.
Farklı yineleyici kavramları okuyabilirsiniz burada .
Bu nedenle, işaretçileri artırmak, bir C dizisini yinelemenin ya da bir C dizisindeki öğelere / ofsetlere erişmenin deyimsel bir C ++ yoludur.