CodeBlanks Logo Icon CodeBlanks

Iterator aritmetiği

Random access iterator'da aritmetik yapmayı öğrenirsin.

Iterator aritmetiği

Rastgele erişim iterator'lar işaretçi aritmetiği destekler. it + n n öğe ileriyi, it - n n öğe geriyi verir. it2 - it1 iki iterator arasındaki mesafeyi öğe sayısıyla verir. it[n] ise *(it + n) kısayoludur.

Bu işlemler yalnızca rastgele erişim iterator'da geçerlidir. İleri yönlü veya çift yönlü iterator'da + kullanırsan derleme hatası alırsın. std::vector ve std::array gibi kapsayıcılar bu aritmetiği destekler; std::list desteklemez.

std::distance

İki iterator arasındaki mesafeyi bulmanın iki yolu vardır. Rastgele erişim iterator'da it2 - it1 doğrudan mesafeyi verir. Diğer kategorilerde std::distance(it1, it2) kullanılır; bu, iterator'ı adım adım ilerleterek sayar.

Bir öğenin indeksini bulmak için std::distance(v.begin(), it) kullanılır. Örneğin auto it = std::find(v.begin(), v.end(), 30); sonrası std::distance(v.begin(), it) 30'un indeksini verir. Bu, iterator'ı indekse dönüştürmenin standart yoludur.

Uygulama Offset ile üçüncü öğeye eriş

v = {7, 14, 21, 28} vektöründe v.begin() ile iterator al ve *(it + 2) ile üçüncü öğeyi std::cout ile yazdır.

Başlangıç kodu

main.cpp
#include <iostream>
#include <vector>

int main() {
    std::vector<int> v = {7, 14, 21, 28};
    // begin() ile iterator al, offset ile eris
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <vector>

int main() {
    std::vector<int> v = {7, 14, 21, 28};
    auto it = v.begin();
    std::cout << *(it + 2);
    return 0;
}

Beklenen çıktı

21

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 İşlemi sonucuna eşle

Kavram Anlamı
it + 3 İleri offset
it - 2 Geri offset
it2 - it1 Mesafe
it[n] n. öğe

2 Hangi işlem yalnızca rastgele erişim iterator'da geçerlidir?

main.cpp
// bu islem her iterator'da calismaz
  • it + 5 ile offset Doğru cevap
  • *it ile dereference
  • ++it ile ilerletme
  • it != end ile karşılaştırma

Açıklama: it + 5 yalnızca rastgele erişim iterator'da çalışır.

3 İndeksi hesapla

Soru
auto idx = std::____(v.begin(), it);
Cevap
auto idx = std::distance(v.begin(), it);

Açıklama: std::distance iterator'ı indekse çevirir.

Orta seviye bölümündeki tüm dersler