Yineleyiciler
Yineleyici, bir C++ Standart Kitaplığı kapsayıcısı içindeki öğeler üzerinde yineleme yapabilecek ve tek tek öğelere erişim sağlayabilen bir nesnedir. C++ Standart Kitaplık kapsayıcılarının tümü, algoritmaların öğelerin depolandığı kapsayıcının türüyle ilgilenmek zorunda kalmadan öğelerine standart bir şekilde erişebilmesi için yineleyiciler sağlar.
Ve gibi begin()
end()
üye ve genel işlevleri ve ve gibi işleçleri ++
--
kullanarak ileri veya geri gitmek için yineleyicileri açıkça kullanabilirsiniz. Yineleyicileri örtük olarak bir aralık döngüsüyle veya (bazı yineleyici türleri için) alt indis işleciyle de kullanabilirsiniz []
.
C++ Standart Kitaplığı'nda, bir sıranın veya aralığın başlangıcı ilk öğedir. Bir sıranın veya aralığın sonu her zaman son öğeyi geçmiş olarak tanımlanır. Genel işlevler begin
ve end
yineleyicileri belirtilen bir kapsayıcıya döndürür. Kapsayıcıdaki tüm öğeler üzerinde tipik açık yineleyici döngüsü şöyle görünür:
vector<int> vec{ 0,1,2,3,4 };
for (auto it = begin(vec); it != end(vec); it++)
{
// Access element using dereference operator
cout << *it << " ";
}
Aynı şey, bir döngü aralığı ile daha basit bir şekilde gerçekleştirilebilir:
for (auto num : vec)
{
// no dereference operator
cout << num << " ";
}
Beş yineleyici kategorisi vardır. Gücü artırmak için kategoriler şunlardır:
Çıkış. Çıkış yineleyicisi
X
işlecini kullanarak++
bir dizi üzerinde ileri doğru yineleyebilir ve işlecini kullanarak*
bir öğeyi yalnızca bir kez yazabilir.Giriş'i seçin. Giriş yineleyicisi
X
işlecini kullanarak++
bir dizi üzerinde ileriye doğru yineleyebilir ve işlecini kullanarak bir öğeyi*
istediğiniz sayıda okuyabilir. ve!=
işleçlerini kullanarak==
giriş yineleyicilerini karşılaştırabilirsiniz. Giriş yineleyicisinin herhangi bir kopyasını artırdıktan sonra, diğer kopyalardan hiçbiri güvenle karşılaştırılamaz, başvurulmaz veya artırılamaz.İletme. İleriye doğru yineleyici
X
+ işlecini kullanarak bir dizi üzerinde ileriye doğru yineleyebilir ve işlecini kullanarak*
herhangi bir öğeyi okuyabilir veya sabit olmayan öğeleri birkaç kez yazabilir. işlecini kullanarak öğe üyelerine->
erişebilir ve ve!=
işleçlerini kullanarak==
ileriye doğru yineleyicileri karşılaştırabilirsiniz. Bir ileriye doğru yineleyicinin birden çok kopyasını oluşturabilirsiniz; bunların her biri bağımsız olarak başvurulabilir ve artırılabilir. Herhangi bir kapsayıcıya başvurmadan başlatılan ileriye doğru yineleyici, null iletme yineleyicisi olarak adlandırılır. Null ileri yineleyiciler her zaman eşit olarak karşılaştırır.Çift yönlü. Çift yönlü yineleyici
X
, ileriye doğru yineleyicinin yerini alabilir. Ancak, , veya(V = *X--)
içinde--X
X--
olduğu gibi bir çift yönlü yineleyiciyi de reddedebilirsiniz. Öğe üyelerine erişebilir ve çift yönlü yineleyicileri ileri yineleyicilerle aynı şekilde karşılaştırabilirsiniz.Rastgele erişim. Rastgele erişim yineleyicisi
X
, çift yönlü yineleyicinin yerini alabilir. Rastgele erişim yineleyicisi ile, öğelere erişmek için alt simge işlecini[]
kullanabilirsiniz. Belirtilen sayıda öğeyi+
ileri veya geri taşımak ve-=
yineleyiciler arasındaki mesafeyi hesaplamak için ,-
ve+=
işleçlerini kullanabilirsiniz. , ,!=
,<
>
,<=
ve>=
kullanarak==
çift yönlü yineleyicileri karşılaştırabilirsiniz.
Tüm yineleyiciler atanabilir veya kopyalanabilir. Bunlar basit nesneler olduğu varsayılır ve genellikle başvuruyla değil değerle geçirilir ve döndürülür. Ayrıca, daha önce açıklanan işlemlerin hiçbirinin geçerli bir yineleyici üzerinde gerçekleştirildiğinde özel durum oluşturamediğini unutmayın.
Yineleyici kategorileri hiyerarşisi üç dizi gösterilerek özetlenebilir. Bir diziye yalnızca yazma erişimi için aşağıdakilerden herhangi birini kullanabilirsiniz:
çıkış yineleyicisi
-> ileri yineleyici
-> çift yönlü yineleyici
-> rastgele erişim yineleyicisi
Sağ ok "ile değiştirilebilir" anlamına gelir. Çıkış yineleyicisini çağıran tüm algoritmalar, örneğin ileriye doğru yineleyici ile düzgün çalışmalıdır, ancak tersi olmamalıdır .
Bir diziye salt okunur erişim için aşağıdakilerden herhangi birini kullanabilirsiniz:
giriş yineleyicisi
-> ileri yineleyici
-> çift yönlü yineleyici
-> rastgele erişim yineleyicisi
Giriş yineleyicisi, bu durumda tüm kategorilerin en zayıfıdır.
Son olarak, bir diziye okuma/yazma erişimi için aşağıdakilerden herhangi birini kullanabilirsiniz:
ileri yineleyici
-> çift yönlü yineleyici
-> rastgele erişim yineleyicisi
Nesne işaretçisi her zaman rastgele erişim yineleyicisi olarak görev yapabilir; bu nedenle, belirttiği diziye uygun okuma/yazma erişimini destekliyorsa herhangi bir yineleyici kategorisi olarak görev yapabilir.
Nesne işaretçisi dışındaki bir yineleyici Iterator
, özelleştirmesi iterator_traits<Iterator>
için gereken üye türlerini de tanımlamalıdır. Bu gereksinimler, ortak temel sınıf yineleyicisinden türetilerek Iterator
karşılanabilir.
Yineleyicilerin C++ Standart Kitaplığı'ndaki kapsayıcılar ve algoritmalar tarafından nasıl kullanıldığını görmek için her yineleyici kategorisinin vaatlerini ve sınırlamalarını anlamak önemlidir.
Not
Aralık için döngüleri kullanarak yineleyicileri açıkça kullanmaktan kaçınabilirsiniz. Daha fazla bilgi için bkz . Deyim için Aralık tabanlı.
Microsoft C++ artık kapsayıcınızın sınırlarının üzerine yazmadığınızdan emin olmak için denetlenen yineleyiciler ve hata ayıklayıcıları sunuyor. Daha fazla bilgi için bkz . İşaretli Yineleyiciler ve Yineleyici Desteğinde Hata Ayıklama.
Ayrıca bkz.
C++ Standart Kitaplığı Başvurusu
C++ Standart Kitaplığında İş Parçacığı Güvenliği