C++ Foreach Döngüsü

C++ dilinde, foreach döngüsü olarak adlandırılan yapının doğrudan bir karşılığı yoktur. Ancak, C++11 ile birlikte gelen range-based for loop (aralık tabanlı for döngüsü) kullanılarak aynı işlevsellik elde edilebilir. Bu döngü, koleksiyonlar (array, vektör, listeler vb.) üzerinde tek tek elemanlar üzerinde işlem yapmayı çok daha kolay ve okunabilir hale getirir.

Range-based for loop, koleksiyonların her bir elemanına tek tek erişim sağlayarak belirli bir işlemi bu elemanlar üzerinde gerçekleştirir.


Range-Based For Döngüsünün Temel Kullanımı

Söz Dizimi:

for (auto& eleman : koleksiyon) {
    // Eleman üzerinde yapılacak işlemler
}

  • auto& eleman: auto kullanarak elemanın tipini derleyiciye bırakıyoruz. Elemanı referansla (&) almak, koleksiyon üzerinde yapılacak değişikliklerin kalıcı olmasını sağlar. Eğer sadece değeri almak istiyorsanız, referans (&) kullanmadan da yazabilirsiniz.
  • koleksiyon: Döngüde üzerinde işlem yapılacak olan koleksiyon (array, vektör, liste vb.).
  • :: Koleksiyonun her bir elemanına sırasıyla erişmek için kullanılır.

Örnek:

Bir dizi (array) üzerinde foreach tarzı bir döngü kullanarak tüm elemanları yazdıralım.

#include <iostream>
using namespace std;

int main() {
    int sayilar[] = {1, 2, 3, 4, 5};  // Bir dizi tanımlanıyor
    
    // Range-based for döngüsü ile dizinin elemanlarını yazdırıyoruz
    for (auto& sayi : sayilar) {
        cout << sayi << " ";
    }
    
    return 0;
}

Bu örnekte:

  • sayilar dizisinin her bir elemanına auto& ile erişiyoruz.
  • sayi her döngü adımında dizinin bir elemanını alır ve cout ile ekrana yazdırılır.
  • Çıktı: 1 2 3 4 5

Range-Based For Döngüsünün Avantajları

  1. Kolay Kullanım: foreach döngüsü, koleksiyonlar üzerinde gezinmeyi çok daha basit hale getirir. İndekslemeye gerek yoktur.
  2. Okunabilirlik: Kodunuz daha temiz ve anlaşılır olur, çünkü koleksiyonun elemanları üzerinde işlem yaparken karmaşık indeksleme işlemleri gerekmez.
  3. Hata Azaltma: Döngüde indeks hataları gibi sorunları önler. Elemanlar doğrudan koleksiyon üzerinden alınır.

Örnek: Vektör Üzerinde Kullanım

Bir vector koleksiyonu üzerinde foreach döngüsünü kullanalım:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> sayilar = {10, 20, 30, 40, 50};  // Bir vektör tanımlanıyor
    
    // Range-based for döngüsü ile vektörün elemanlarını yazdırıyoruz
    for (auto& sayi : sayilar) {
        cout << sayi << " ";
    }
    
    return 0;
}

Bu örnekte:

  • sayilar vektörünün her bir elemanına auto& ile erişiyoruz.
  • Çıktı: 10 20 30 40 50

Dizi Elemanlarını Değiştirme

Eğer elemanları değiştirmek isterseniz, auto& kullanarak elemanları referansla almanız gerekir. Bu şekilde, koleksiyon üzerindeki gerçek verilere erişirsiniz.

#include <iostream>
using namespace std;

int main() {
    int sayilar[] = {1, 2, 3, 4, 5};  // Bir dizi tanımlanıyor
    
    // Range-based for döngüsü ile dizinin elemanlarını iki katına çıkarıyoruz
    for (auto& sayi : sayilar) {
        sayi *= 2;  // Her bir elemanı iki katına çıkarıyoruz
    }
    
    // Yeni diziyi yazdıralım
    for (auto& sayi : sayilar) {
        cout << sayi << " ";
    }
    
    return 0;
}

Bu örnekte:

  • Dizinin her bir elemanını iki katına çıkarıyoruz.
  • Çıktı: 2 4 6 8 10

auto& ile Değer Değiştirmeme

Eğer dizinin veya koleksiyonun elemanlarını değiştirmek istemiyorsanız, auto kullanarak sadece değeri alabilirsiniz. Bu durumda, referans kullanmamıza gerek yoktur.

#include <iostream>
using namespace std;

int main() {
    int sayilar[] = {1, 2, 3, 4, 5};  // Bir dizi tanımlanıyor
    
    // Range-based for döngüsü ile dizinin elemanlarını yazdırıyoruz, fakat değiştirmiyoruz
    for (auto sayi : sayilar) {
        sayi *= 2;  // Bu sadece sayi değişkenini iki katına çıkarır, diziyi etkilemez
    }
    
    // Diziyi tekrar yazdıralım
    for (auto& sayi : sayilar) {
        cout << sayi << " ";  // Değişiklik yapılmadı
    }
    
    return 0;
}

Bu örnekte:

  • auto kullanarak dizinin elemanını alıyoruz ama değiştirmiyoruz.
  • Çıktı: 1 2 3 4 5 (Dizinin elemanları değişmemiştir)

Sonuç

C++ dilinde foreach döngüsünün doğrudan bir karşılığı olmasa da, C++11 ile gelen range-based for loop sayesinde koleksiyonlar üzerinde çok kolay ve etkili bir şekilde işlem yapabilirsiniz. Bu döngü, koleksiyonlar üzerinde gezinmek, elemanları değiştirmek veya sadece okumak için çok kullanışlıdır. Geliştiriciler için kod yazarken okunabilirlik ve hata yapma olasılığı açısından büyük bir avantaj sağlar.

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir