Iterators: STL Konteynerları Üzerinde Gezinme Teknikleri

crazy_coder

Moderatör
Katılım
20 Şub 2026
Mesajlar
204
Tepkime puanı
0
Puanları
16

Iterators: Konteynerlerin Ortak Dili​


İteratörler, algoritmalara (sıralama, arama vb.) verinin nerede başlayıp nerede bittiğini ve bir sonraki elemana nasıl geçileceğini söyler. Bu sayede bir algoritma, verinin bir vector mü yoksa list mi olduğunu bilmeden görevini yapabilir.



1. Temel Kavramlar: begin() ve end()​


İteratörlerin çalışma mantığını anlamak için iki kritik fonksiyonu bilmek gerekir:

begin(): Konteynerin ilk elemanını işaret eder.

end(): Konteynerin son elemanından bir sonraki (hayali) noktayı işaret eder. Bu, döngülerin nerede duracağını belirlemek içindir.

C++:
#include <vector>
#include <iostream>

int main() {
std::vector<int> v = {10, 20, 30};

// İteratör tanımlama (Geleneksel yöntem)
std::vector<int>::iterator it;

// begin'den başla, end'e gelene kadar ilerle
for (it = v.begin(); it != v.end(); ++it) {
    std::cout << *it << " "; // * operatörü ile içindeki değere erişilir (dereferencing)
}

}
CODE]

[HR][/HR]

[HEADING=2]2. İteratör Türleri[/HEADING]

Her konteyner her türlü hareketi desteklemez. C++'ta iteratörler yeteneklerine göre kategorize edilir:

[TABLE]
[TR]
[TH][B]İteratör Türü[/B][/TH]
[TH][B]Yetenek[/B][/TH]
[TH][B]Hangi Konteynerde?[/B][/TH]
[/TR]
[TR]
[TD][B]Input/Output[/B][/TD]
[TD]Tek yönlü okuma/yazma.[/TD]
[TD]Dosya akışları (stream).[/TD]
[/TR]
[TR]
[TD][B]Forward[/B][/TD]
[TD]Sadece ileri gidebilir.[/TD]
[TD]forward_list[/TD]
[/TR]
[TR]
[TD][B]Bidirectional[/B][/TD]
[TD]Hem ileri hem geri gidebilir.[/TD]
[TD]list, map, set[/TD]
[/TR]
[TR]
[TD][B]Random Access[/B][/TD]
[TD]Doğrudan istediği adrese atlar.[/TD]
[TD][B]vector, deque, array[/B][/TD]
[/TR]
[/TABLE]

[HR][/HR]

[HEADING=2]3. Modern C++ ve auto Kolaylığı[/HEADING]

Eskiden std::map<std::string, std::vector<int>>::iterator gibi uzun tipler yazmak zorundaydık. C++11 ile gelen auto anahtar kelimesi, derleyicinin tipi otomatik anlamasını sağlayarak kodumuzu tertemiz hale getirdi.

[CODE=cpp]
// Modern ve kısa kullanım
for (auto it = v.begin(); it != v.end(); ++it) {
*it += 5; // Değerleri 5 artır
}

// Tersten gezinmek için: reverse_iterator
for (auto rit = v.rbegin(); rit != v.rend(); ++rit) {
std::cout << *rit << " "; // 30 20 10
}
CODE]

[HR][/HR]

[HEADING=2]4. Dikkat: İteratör Geçersiz Kılınması (Invalidation)[/HEADING]

Bir vektör üzerinde gezinirken push_back veya erase yaparsanız, vektör bellekte yer değiştirebilir ve elinizdeki iteratör [B]geçersiz[/B] hale gelebilir. Bu durum, programın çökmesine neden olan en yaygın hatalardan biridir.

[QUOTE][B]Kritik Kural:[/B] Bir döngü içinde konteynerin boyutunu değiştiren işlemler yapıyorsanız, iteratörün güncel kaldığından emin olun (Örneğin erase fonksiyonunun döndürdüğü yeni iteratörü yakalayın).[/QUOTE]

[HR][/HR]

[HEADING=2]Sonuç[/HEADING]

İteratörler, C++'ın esnekliğini sağlayan gizli kahramanlardır. Onlar sayesinde algoritmalar veri yapısından bağımsız hale gelir. Eğer bir elemana sadece "bakmak" değil, onun üzerinde "gezerek" işlem yapmak istiyorsanız, iteratörler en güçlü aracınızdır.
 
Geri
Üst