Bir C++'da yineleyici STL kabının bir elemanına işaret eden işaretçi benzeri bir nesnedir. Genellikle C++'da STL kabının içeriği arasında geçiş yapmak için kullanılırlar. STL yineleyicilerinin temel avantajı, STL algoritmalarını kullanılan kapsayıcı türünden bağımsız hale getirmeleridir. Yineleyiciyi, kabın kendisini STL algoritmalarına aktarmak yerine, konteyner elemanlarına aktarabiliriz.
Yineleyici Bildirgesi
C++ STL'deki her konteynerin kendi yineleyicisi vardır. Bu yüzden bir yineleyiciyi şu şekilde bildirmemiz gerekir:
C++
<type>::iterator it;
Neresi
- tip: Yineleyicinin bildirildiği kapsayıcı türü.
- BT: Yineleyici nesneye atanan ad.
Daha sonra geçerli bir yineleyici atayarak onu başlatabiliriz. Açıklama sırasında atanacak bir yineleyicimiz zaten varsa, tür bildirimini kullanarak atlayabiliriz. oto anahtar kelime.
C++auto it = iter
Neresi tekrar yeni oluşturulan iteratöre atanan yineleyicidir.
Bizim C++ Kursu STL'de yineleyicilerin kullanımını kapsayarak farklı konteyner türlerinde nasıl geçiş yapacağınızı anlamanızı sağlar.
Yineleyici Örnekleri
Aşağıdaki program, vektör kabını geçmek için yineleyicinin nasıl kullanılacağını göstermektedir:
C++#include using namespace std; int main() { vector<int> v = {1 2 3 4 5}; // Defining an iterator pointing to // the beginning of the vector vector<int>::iterator first = v.begin(); // Defining an iterator pointing // to the end of the vector vector<int>::iterator last = v.end(); // Iterating the whole vector while(first != last) { cout << *first << ' '; first++; } return 0; }
Çıkış
1 2 3 4 5
Fark etmiş olabileceğiniz gibi kullandık vektör::begin() ve vektör::end() işlev. Bu işlevler, yineleyiciyi vektörün ilk ve son öğesinden sonraki bir öğeye döndüren std::vector'un üye işlevleridir. Vektörleri yinelemek için bu işlevlerde yineleyicilerin dönüşünü kullanırız.
Konteyner Yineleyici İşlevleri
C++ STL bazı üye işlevlerini sağlar STL konteyneri yineleyicileri en azından ilk ve son öğeye döndüren. Bu üye işlevler hemen hemen tüm STL konteynerlerinde tanımlanmıştır (bazı sınırlı erişimli konteynerleri bırakarak yığın sıra ) tutarlılık için aynı adla.
Aşağıdaki tabloda yineleyiciyi kapsayıcılara döndüren tüm yöntemler listelenmektedir:
Yineleyici İşlevi | Dönüş Değeri |
|---|---|
başlamak() | Bir yineleyiciyi kabın başlangıcına döndürür. |
son() | Kabın son öğesinden hemen sonra teorik öğeye bir yineleyici döndürür. |
cbegin() | Kabın başlangıcına sabit bir yineleyici döndürür. Sabit bir yineleyici, işaret ettiği öğenin değerini değiştiremez. |
bir kaç() SQL cümleleri | Kabın son öğesinden hemen sonra teorik öğeye sabit bir yineleyici döndürür. |
rbegin() | Kabın başlangıcına ters yineleyici döndürür. |
oluşturma() | Kabın son öğesinden hemen sonra teorik öğeye ters bir yineleyici döndürür. |
crbegin() | Kabın başlangıcına sabit bir ters yineleyici döndürür. |
CREND () | Kabın son öğesinden hemen sonra teorik öğeye sabit bir ters yineleyici döndürür. |
Örneğin eğer bir şey vektörün adı ise yukarıdaki yöntemleri aşağıda gösterildiği gibi kullanabiliriz:
C++vec.begin() vec.rbegin() vec.cbegin() vec.crbegin() vec.end() vec.rend() vec.cend() vec.crend()
Yineleyici İşlemleri
İşaretçi aritmetiği gibi, C++ yineleyicilerinde de izin verilen bazı işlemler vardır. Yineleyicilerin önemini artıran farklı işlevler sağlamak için kullanılırlar. 5 geçerli var C++'da yineleyici işlemler :
- Referans Kaldırma Yineleyicileri
- Yineleyicileri Artırma/Azaltma
- Yineleyicilere Tamsayı Ekleme/Çıkarma
- Başka Bir Yineleyiciyi Çıkarma
- Yineleyicileri Karşılaştırma
Referans Kaldırma Yineleyicileri
Referans kaldırma işlemi kullanıcılara şunları sağlar: erişim veya güncelleme yineleyicinin işaret ettiği öğenin değeri. biz kullanıyoruz (*) dolaylı operatör tıpkı işaretçiler gibi yineleyicilerin referansını kaldırmak için.
C++// Access *it; // Update *it = new_val;
Neresi yeni_val yineleyici tarafından işaret edilen öğeye atanan yeni değerdir BT .
Yineleyicileri Artırma/Azaltma
Yineleyiciyi kullanarak 1 artırabilir veya azaltabiliriz. (++) veya (--) operatörleri sırasıyla. Arttırma işlemi yineleyiciyi kaptaki bir sonraki öğeye taşırken, azaltma işlemi yineleyiciyi bir önceki öğeye taşır.
C++it++; // post-increment ++it; // pre-increment it--; // post-decrement --it; // pre-decrement
Yineleyicilere Tamsayı Ekleme/Çıkarma
Ayrıca yineleyicilere bir tamsayı değeri ekleyebilir veya çıkartabiliriz. Eklenen tamsayı değerine göre yineleyicinin sonraki veya önceki konumu daha fazla olacaktır.
C++// Addition it + int_val; // Subtraction it - int_val;
Neresi int_val yineleyiciye eklenen veya çıkarılan tam sayı değerleridir BT .
Başka Bir Yineleyiciyi Çıkarma
İşaret ettikleri bellek arasındaki mesafeyi (veya öğe sayısını) bulmak için bir yineleyiciyi diğerinden çıkarabiliriz.
C++it1 - it2
Yineleyicileri Karşılaştırma
Aralarındaki ilişkiyi bulmak için aynı türdeki iki yineleyiciyi birbirlerine karşı da test edebiliriz. (==) eşitlik ve (!=) eşitsizlik operatörleri gibi ilişkisel operatörleri, aşağıdaki gibi diğer ilişkisel operatörlerle birlikte kullanabiliriz.< > <= >=.
C++it1 != it2 // Equal to it1 == it2 // Not equal to it1 > it2 // Greater than it1 < it2 // Less than it1 >= it2 // Greater than equal to it1 <= it2 // Less than equal to
C++'da Yineleyici Türleri
STL yineleyicileri, üzerlerinde gerçekleştirilebilecek işlemlere göre bölünebilir. C++'da desteklenen kapsayıcılar ve desteklenen yineleyici işlemleriyle birlikte aşağıdaki tabloda listelenen 5 ana yineleyici türü vardır.
Yineleyici | Tanım | Desteklenen Konteynerler | Desteklenen İşlemler |
|---|---|---|---|
Giriş Yineleyici | Değerleri okumak için kullanılan tek yönlü bir yineleyicidir. | Giriş Akışı | Artış Eşitliğini Kaldırma |
Çıkış Yineleyici | Aynı zamanda tek yönlü bir yineleyicidir ancak değerleri atamak için kullanılır. Değerlere erişilemiyor. | Çıkış Akışı | Referans kaldırma (yalnızca yazma) Artış |
İleri Yineleyiciler | Değerlere erişebilir ve aynı zamanda atayabilir. Hem giriş hem de çıkış yineleyicisinin birleşimidir. | forward_list unordered_map unordered_set | Artış Eşitliğini Kaldırma |
Çift Yönlü Yineleyiciler | Her iki yönde de ileri veya geri hareket edebilir. Liste seti ve çoklu harita gibi kaplar çift yönlü yineleyicileri destekler. | liste harita seti çoklu harita çoklu seti | Artış/Azalış Eşitliğini Kaldırma |
Rastgele Erişim Yineleyicileri | Rastgele erişim yineleyicileri, işaret ettikleri öğeden uzaktaki öğelere erişmek için kullanılabilecek yineleyicilerdir ve işaretçilerle aynı işlevi sunar. | vektör deque dizi dizisi pandanın pivotu | Tüm |
Yukarıdaki tablodan giriş ve çıkış yineleyicilerinin dışında fark etmiş olabileceğimiz gibi Tabloda aşağı indikçe yineleyici türü, bazı yeni özelliklerin yanı sıra yukarıdaki yineleyicinin özelliklerini de içerir.
Yineleyici Adaptörler
C++'daki yineleyici bağdaştırıcıları, özel işlevsellik sağlamak için geleneksel yineleyiciler üzerine oluşturulan özel türde yineleyicilerdir. C++'da bazıları aşağıda verilen birçok yineleyici bağdaştırıcı vardır:
Yineleyici Adaptör Türü | Tanım |
|---|---|
Ters Yineleyici | Ters yineleyici, çift yönlü veya üstü tipte operatör üzerine inşa edilmiştir ve kullanıcıların konteyneri ters yönde hareket ettirmesine olanak tanır. |
Akış Yineleyicileri | Akış yineleyicileri, yani istream ve ostream yineleyicileri, sırasıyla giriş ve çıkış yineleyicileri üzerine kuruludur. Bu yineleyiciler, kullanıcıların akışları kapsayıcı olarak kullanmalarına olanak tanır. |
Yineleyicileri Taşı | Hareket yineleyicileri, STL algoritmalarında hareket semantiğini tanıtmak için kullanılır. Taşıma yineleyicileri, kopyalanan kapsayıcı verilerinin sahipliğini, fazladan kopyalar oluşturmadan kopyalama kapsayıcısına taşır. |
Ekleyici Yineleyici | Yerleştirici yineleyiciler, verilen öğeleri kapsayıcının herhangi bir konumuna yerleştirmenize olanak tanır. C++'da üç yerleştirici yineleyici vardır:
Bu yineleyiciler kullanılarak oluşturulabilir back_inserter() front_inserter() sokmak() C++'da işlevler. |
C++'da Yineleyici Yardımcı Program İşlevleri
C++ STL, yineleyicilerle çalışmayı basitleştirmek için çeşitli işlevler sağlar. Aşağıdaki tabloda listelenmiştir:
| İşlev | Tanım | Sözdizimi |
|---|---|---|
| std::ileri | Bir yineleyiciyi belirli sayıda konum kadar ilerletir. | ilerlemek ( o ) |
| std::sonraki | Verilen yineleyicinin ilerisinde belirtilen sayıda konum olan yineleyiciyi döndürür. | Sonraki ( o ) |
| Std :: Önceki | Verilen yineleyicinin arkasında belirtilen sayıda konum olan yineleyiciyi döndürür. | önceki ( o ) |
| std::mesafe | İki yineleyici arasındaki öğe sayısını döndürür. | mesafe ( it1 it2 ) |
| std::başla | Verilen kabın ilk öğesine bir yineleyici döndürür. | başlamak ( konteyner ) |
| std::son | Verilen kabın son öğesini takip eden öğeye bir yineleyici döndürür. | son ( konteyner ) |
| std::rbaşla | Verilen kapsayıcının son öğesine ters yineleyici döndürür. | yeniden başla ( konteyner ) |
| std::parça | Verilen kapsayıcının ilk öğesinden önceki öğeye ters yineleyici döndürür. | yapar ( konteyner ) |
| std::ekleyici | Öğeleri belirtilen konumdaki bir kapsayıcıya ekleyen bir ekleme yineleyicisi oluşturur. | yerleştirici ( konteyner konumu ) |
| std::back_inserter | Öğeleri kabın sonuna ekleyen bir geri ekleme yineleyicisi oluşturur. | back_inserter ( konteyner ) |
| std::front_inserter | Bir kabın önüne öğeler ekleyen bir ön ekleme yineleyicisi oluşturur. | front_inserter ( konteyner ) |
Yineleyicilerin Örneklerle Uygulamaları
Yineleyiciler, C++'da STL kapsayıcıları ve algoritmalarıyla çalışırken birçok farklı amaç için yaygın olarak kullanılır. Aşağıda C++'daki yineleyicilerin kod örnekleri olan bazı temel uygulamaları verilmiştir:
Konteynerlerin Geçişi
STL konteynerlerini dolaşmak yineleyicilerin en temel uygulamasıdır. Burada, başlangıç ve bitiş yineleyicilerinin tüm konteyneri dolaşmasını sağlamak için begin() ve end() işlevlerini kullanırız. Temel olarak, başlangıç yineleyicisini sonuna eşit olmayana kadar artırmaya devam ediyoruz.
Örnek
C++#include using namespace std; int main() { set<int> s = {10 20 30 40 50}; // Iterator to the beginning // of the set auto it = s.begin(); // Iterating through the // entire set while (it != s.end()) { // Dereferencing iterator // to access value cout << *it << ' '; // Incrementing the // iterator it++; } return 0; }
Çıkış
10 20 30 40 50
Yukarıdaki kodda gösterildiği gibi set konteynerinin üzerinden geçiyoruz. Benzer şekilde herhangi bir konteynerin üzerinden geçmek için aynı yaklaşımı kullanabiliriz.
Bir Kabı Ters Çevirme
Ters yineleyiciler, geri alma işlemini manuel olarak yapmanıza gerek kalmadan bir kapsayıcıyı baştan sona geçmenize olanak tanır.
Örnek
C++#include using namespace std; int main() { vector<int> vec = {10 20 30 40 50}; // Defining reverse iterators // pointing to the reverse // beginning of vec auto it = vec.rbegin(); // Iterating the whole // vector in reverse while (it != vec.rend()) { cout << *it << ' '; it++; } return 0; }
Çıkış
50 40 30 20 10
Konteynerden Bağımsız Algoritmalar
Yineleyiciler, algoritmaların herhangi bir kapsayıcı türüyle çalışmasına izin vererek std::sort() std::find() ve std::for_each() gibi işlevleri daha esnek hale getirir. Gerçek kapsayıcı yerine yineleyicileri iletebilirsiniz.
Örnek
C++#include using namespace std; int main() { vector<int> vec = {30 10 40 10 50}; multiset<int> ms = {10 30 10 20 40 10}; // Using the std::count() algorithm to count // the number of occurences of 10 in vector // and multiset using iterator cout << '10s in Vector: ' << count(vec.begin() vec.end() 10) << endl; cout << '10s in Multiset: ' << count(ms.begin() ms.end() 10); return 0; }
Çıkış
10s in Vector: 2 10s in Multiset: 3
Yineleyicilerin Ek Uygulamaları
STL yineleyicilerinin daha fazla uygulaması var:
- Mesafe Hesaplaması: std::distance() yineleyicilerinin kullanılması, bir kaptaki iki konum arasındaki öğe sayısının hesaplanmasına yardımcı olur.
- Akış Yinelemesi: Akış yineleyiciler, giriş/çıkış akışlarını kaplar gibi işlemenize olanak tanır ve STL algoritmalarını kullanarak akışlardan okumayı ve akışlara yazmayı kolaylaştırır.
- STL Algoritmalarında Anlambilimi Taşıma: Taşıma yineleyicileri, gereksiz kopyalamayı önleyerek performansı ve verimliliği artırmaya yardımcı olan STL algoritmalarına taşıma semantiğini sunar. Veriler, taşıma semantiği kurallarına göre taşınacaktır.
- Veri Yapıları için Özel Yineleyiciler: STL algoritmalarına ve diğer birçok özelliğe destek sağlamak amacıyla ağaçlar veya grafikler gibi STL olmayan veri yapıları için özel yineleyiciler uygulanabilir. Arttırma, azaltma ve diğer işlemleri uygun şekilde sağlamak için birkaç kural ve anlaşmaya uymamız gerekebilir.