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ınaauto&
ile erişiyoruz.sayi
her döngü adımında dizinin bir elemanını alır vecout
ile ekrana yazdırılır.- Çıktı:
1 2 3 4 5
Range-Based For Döngüsünün Avantajları
- Kolay Kullanım:
foreach
döngüsü, koleksiyonlar üzerinde gezinmeyi çok daha basit hale getirir. İndekslemeye gerek yoktur. - Okunabilirlik: Kodunuz daha temiz ve anlaşılır olur, çünkü koleksiyonun elemanları üzerinde işlem yaparken karmaşık indeksleme işlemleri gerekmez.
- 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ınaauto&
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.