Range-based for
- C++ kursu
- Orta seviye
- Ders 62/116
- 5 dk
Range-based for ve iterator ilişkisini öğrenirsin.
Range-based for
Range-based for döngüsü, iterator tabanlı döngünün kısa yazımıdır: for (auto x : v) { ... }. Derleyici arka planda v.begin() ve v.end() çağırır, döngü değişkenine her öğeyi sırayla atar.
Yani for (auto x : v) aslında for (auto it = v.begin(); it != v.end(); ++it) { auto x = *it; ... } ile eşdeğerdir. Bu yüzden iterator destekleyen her kapsayıcıda range-based for çalışır. Daha az yazım hatası yaparsın ve kod daha okunaklı olur.
Referans ve kopya
Range-based for'da auto x öğenin kopyasıdır; x üzerinde yapılan değişiklik v'yi etkilemez ve büyük öğelerde performans kaybı yaratır. auto& x ise referans alır; x'i değiştirmek v'deki öğeyi değiştirir ve kopya maliyeti yoktur.
Yalnızca okuma yapacaksan const auto& x kullan. Bu hem kopya maliyetini önler hem de yanlışlıkla değiştirmeyi engeller. Modern C++'ta bu üç kullanım çok yaygındır: auto, auto&, const auto&.
Uygulama Range-based for ile ikiye katla
v = {1, 2, 3} vektöründe for (auto& x : v) ile her öğeyi ikiye katla. Sonra ayrı bir for (int x : v) ile her öğeyi boşlukla yazdır.
Başlangıç kodu
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3};
// range-based for ile her ögeyi ikiye katla, sonra yazdir
return 0;
}Örnek çözüm
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3};
for (auto& x : v) {
x = x * 2;
}
for (int x : v) {
std::cout << x << " ";
}
return 0;
}Beklenen çıktı
2 4 6
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 for (auto x : v) ne yapar?
std::vector<int> v = {1, 2, 3};
for (auto x : v) { }- Sonsuz döngü oluşturur
- v'nin kopyasını oluşturur
- v'yi kalıcı olarak değiştirir
- Her öğeyi x'e kopyalayıp döner Doğru cevap
Açıklama: Her öğe sırayla x'e kopyalanır.
2 Range-based for sözdizimini tamamla
for (auto ____ : v) {
std::cout << x;
}
for (auto x : v) {
std::cout << x;
}
Açıklama: for (auto x : v) by-value döngü oluşturur.
3 Kullanımı amacıyla eşle
| Kavram | Anlamı |
|---|---|
for (auto x : v) |
Kopya döngü |
for (auto& x : v) |
Referans döngü |
for (const auto& x : v) |
Salt okunur |
v.begin(), v.end() |
Arka planda çağrılır |